Rob Shearman : wininet:
Always make copies of strings passed to INTERNET_SendCallback.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 5 13:10:24 CST 2007
Module: wine
Branch: master
Commit: 07daeff8f463d364deeff17a6a03439e9bfc9193
URL: http://source.winehq.org/git/wine.git/?a=commit;h=07daeff8f463d364deeff17a6a03439e9bfc9193
Author: Rob Shearman <rob at 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;
}
}
More information about the wine-cvs
mailing list