Jacek Caban : wininet: Properly handle output buffer size in InternetGetCookieA.

Alexandre Julliard julliard at winehq.org
Fri Dec 28 15:05:15 CST 2012


Module: wine
Branch: master
Commit: f877fe9ba4562edb19752b456b7bd908fd5dc95d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f877fe9ba4562edb19752b456b7bd908fd5dc95d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec 27 17:54:29 2012 +0100

wininet: Properly handle output buffer size in InternetGetCookieA.

---

 dlls/wininet/cookie.c         |   16 +++++++++++++---
 dlls/wininet/tests/internet.c |    7 +++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index cd761b1..76f9ac5 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -678,7 +678,7 @@ BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
     LPSTR lpCookieData, LPDWORD lpdwSize)
 {
     WCHAR *url, *name;
-    DWORD len;
+    DWORD len, size;
     BOOL r;
 
     TRACE("(%s %s %p %p(%u))\n", debugstr_a(lpszUrl), debugstr_a(lpszCookieName),
@@ -701,8 +701,18 @@ BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
         {
             r = InternetGetCookieW( url, name, szCookieData, &len );
 
-            *lpdwSize = WideCharToMultiByte( CP_ACP, 0, szCookieData, len,
-                                             lpCookieData, lpCookieData ? *lpdwSize : 0, NULL, NULL );
+            if(r) {
+                size = WideCharToMultiByte( CP_ACP, 0, szCookieData, len, NULL, 0, NULL, NULL);
+                if(lpCookieData) {
+                    if(*lpdwSize >= size) {
+                        WideCharToMultiByte( CP_ACP, 0, szCookieData, len, lpCookieData, *lpdwSize, NULL, NULL);
+                    }else {
+                        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                        r = FALSE;
+                    }
+                }
+                *lpdwSize = size;
+            }
 
             heap_free( szCookieData );
         }
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index 8b0071c..c93c37a 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -414,6 +414,13 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
+  len = 10;
+  memset(buffer, 0xac, sizeof(buffer));
+  ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len);
+  ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+     "InternetGetCookie returned: %x(%u), expected ERROR_INSUFFICIENT_BUFFER\n", ret, GetLastError());
+  ok(len == 19, "len = %u\n", len);
+
   len = 1024;
   ret = InternetGetCookieW(testing_example_comW, NULL, NULL, &len);
   ok(ret == TRUE,"InternetGetCookieW failed\n");




More information about the wine-cvs mailing list