Module: wine Branch: master Commit: 07daeff8f463d364deeff17a6a03439e9bfc9193 URL: http://source.winehq.org/git/wine.git/?a=commit;h=07daeff8f463d364deeff17a6a...
Author: Rob Shearman rob@codeweavers.com Date: Mon Mar 5 12:06:47 2007 +0000
wininet: Always make copies of strings passed to INTERNET_SendCallback.
This ensures that applications that change the strings received in status callbacks don't affect the data needed to successfully connect to the correct server.
---
dlls/wininet/tests/http.c | 5 +++++ dlls/wininet/utility.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index 91438c6..8926968 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -56,21 +56,25 @@ static VOID WINAPI callback( trace("%04x:Callback %p 0x%lx INTERNET_STATUS_RESOLVING_NAME "%s" %d\n", GetCurrentThreadId(), hInternet, dwContext, (LPCSTR)lpvStatusInformation,dwStatusInformationLength); + *(LPSTR)lpvStatusInformation = '\0'; break; case INTERNET_STATUS_NAME_RESOLVED: trace("%04x:Callback %p 0x%lx INTERNET_STATUS_NAME_RESOLVED "%s" %d\n", GetCurrentThreadId(), hInternet, dwContext, (LPCSTR)lpvStatusInformation,dwStatusInformationLength); + *(LPSTR)lpvStatusInformation = '\0'; break; case INTERNET_STATUS_CONNECTING_TO_SERVER: trace("%04x:Callback %p 0x%lx INTERNET_STATUS_CONNECTING_TO_SERVER "%s" %d\n", GetCurrentThreadId(), hInternet, dwContext, (LPCSTR)lpvStatusInformation,dwStatusInformationLength); + *(LPSTR)lpvStatusInformation = '\0'; break; case INTERNET_STATUS_CONNECTED_TO_SERVER: trace("%04x:Callback %p 0x%lx INTERNET_STATUS_CONNECTED_TO_SERVER "%s" %d\n", GetCurrentThreadId(), hInternet, dwContext, (LPCSTR)lpvStatusInformation,dwStatusInformationLength); + *(LPSTR)lpvStatusInformation = '\0'; break; case INTERNET_STATUS_SENDING_REQUEST: trace("%04x:Callback %p 0x%lx INTERNET_STATUS_SENDING_REQUEST %p %d\n", @@ -150,6 +154,7 @@ static VOID WINAPI callback( trace("%04x:Callback %p 0x%lx INTERNET_STATUS_REDIRECT "%s" %d\n", GetCurrentThreadId(), hInternet, dwContext, (LPCSTR)lpvStatusInformation, dwStatusInformationLength); + *(LPSTR)lpvStatusInformation = '\0'; break; case INTERNET_STATUS_INTERMEDIATE_RESPONSE: trace("%04x:Callback %p 0x%lx INTERNET_STATUS_INTERMEDIATE_RESPONSE %p %d\n", diff --git a/dlls/wininet/utility.c b/dlls/wininet/utility.c index 273177d..34e72d0 100644 --- a/dlls/wininet/utility.c +++ b/dlls/wininet/utility.c @@ -231,13 +231,25 @@ VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext, case INTERNET_STATUS_CONNECTING_TO_SERVER: case INTERNET_STATUS_CONNECTED_TO_SERVER: lpvNewInfo = WININET_strdup_AtoW(lpvStatusInfo); + break; + case INTERNET_STATUS_RESOLVING_NAME: + case INTERNET_STATUS_REDIRECT: + lpvNewInfo = WININET_strdupW(lpvStatusInfo); + break; } }else { switch(dwInternetStatus) { + case INTERNET_STATUS_NAME_RESOLVED: + case INTERNET_STATUS_CONNECTING_TO_SERVER: + case INTERNET_STATUS_CONNECTED_TO_SERVER: + lpvNewInfo = HeapAlloc(GetProcessHeap(), 0, strlen(lpvStatusInfo) + 1); + if (lpvNewInfo) strcpy(lpvNewInfo, lpvStatusInfo); + break; case INTERNET_STATUS_RESOLVING_NAME: case INTERNET_STATUS_REDIRECT: lpvNewInfo = WININET_strdup_WtoA(lpvStatusInfo); + break; } }