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