diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index bc8ffdf7c8f..c3de762358f 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -2733,8 +2733,11 @@ static VOID INTERNET_ExecuteWork(void) TRACE("SENDCALLBACK %p\n", workRequest.hdr); SendSyncCallback(workRequest.hdr, - req->dwContext, req->dwInternetStatus, req->lpvStatusInfo, - req->dwStatusInfoLength); + req->dwContext, req->dwInternetStatus, req->lpvStatusInfo, + req->dwStatusInfoLength); + + /* And frees the copy of the status info */ + HeapFree(GetProcessHeap(), 0, req->lpvStatusInfo); } break; diff --git a/dlls/wininet/utility.c b/dlls/wininet/utility.c index c3b46c1389c..d76bed3c272 100644 --- a/dlls/wininet/utility.c +++ b/dlls/wininet/utility.c @@ -276,13 +276,20 @@ VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext, { WORKREQUEST workRequest; struct WORKREQ_SENDCALLBACK *req; - + void *lpvStatusInfo_copy = lpvStatusInfo; + + if (lpvStatusInfo) + { + lpvStatusInfo_copy = HeapAlloc(GetProcessHeap(), 0, dwStatusInfoLength); + memcpy(lpvStatusInfo_copy, lpvStatusInfo, dwStatusInfoLength); + } + workRequest.asyncall = SENDCALLBACK; workRequest.hdr = WININET_AddRef( hdr ); req = &workRequest.u.SendCallback; req->dwContext = dwContext; req->dwInternetStatus = dwInternetStatus; - req->lpvStatusInfo = lpvStatusInfo; + req->lpvStatusInfo = lpvStatusInfo_copy; req->dwStatusInfoLength = dwStatusInfoLength; INTERNET_AsyncCall(&workRequest);