Jacek Caban : wininet: Fixed NULL cookie data pointer handling in InternetGetCookieA.

Alexandre Julliard julliard at winehq.org
Mon Dec 3 13:33:57 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Dec  3 15:01:08 2012 +0100

wininet: Fixed NULL cookie data pointer handling in InternetGetCookieA.

---

 dlls/wininet/cookie.c         |   13 ++++++++-----
 dlls/wininet/tests/internet.c |   31 +++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index 0a65e4c..42c7525 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -657,12 +657,12 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
 BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
     LPSTR lpCookieData, LPDWORD lpdwSize)
 {
+    WCHAR *url, *name;
     DWORD len;
-    LPWSTR szCookieData = NULL, url, name;
     BOOL r;
 
-    TRACE("(%s,%s,%p)\n", debugstr_a(lpszUrl), debugstr_a(lpszCookieName),
-        lpCookieData);
+    TRACE("(%s %s %p %p(%u))\n", debugstr_a(lpszUrl), debugstr_a(lpszCookieName),
+          lpCookieData, lpdwSize, lpdwSize ? *lpdwSize : 0);
 
     url = heap_strdupAtoW(lpszUrl);
     name = heap_strdupAtoW(lpszCookieName);
@@ -670,6 +670,8 @@ BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
     r = InternetGetCookieW( url, name, NULL, &len );
     if( r )
     {
+        WCHAR *szCookieData;
+
         szCookieData = heap_alloc(len * sizeof(WCHAR));
         if( !szCookieData )
         {
@@ -680,10 +682,11 @@ BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
             r = InternetGetCookieW( url, name, szCookieData, &len );
 
             *lpdwSize = WideCharToMultiByte( CP_ACP, 0, szCookieData, len,
-                                    lpCookieData, *lpdwSize, NULL, NULL );
+                                             lpCookieData, lpCookieData ? *lpdwSize : 0, NULL, NULL );
+
+            heap_free( szCookieData );
         }
     }
-    heap_free( szCookieData );
     heap_free( name );
     heap_free( url );
     return r;
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index cf1fc4e..1b4ee46 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -370,6 +370,10 @@ static void test_complicated_cookie(void)
 
   CHAR buffer[1024];
   CHAR user[256];
+  WCHAR wbuf[1024];
+
+  static const WCHAR testing_example_comW[] =
+      {'h','t','t','p',':','/','/','t','e','s','t','i','n','g','.','e','x','a','m','p','l','e','.','c','o','m',0};
 
   ret = InternetSetCookie("http://www.example.com/bar",NULL,"A=B; domain=.example.com");
   ok(ret == TRUE,"InternetSetCookie failed\n");
@@ -391,8 +395,16 @@ static void test_complicated_cookie(void)
   ok(ret == TRUE,"InternetSetCookie failed\n");
 
   len = 1024;
+  ret = InternetGetCookie("http://testing.example.com", NULL, NULL, &len);
+  ok(ret == TRUE,"InternetGetCookie failed\n");
+  ok(len == 19, "len = %u\n", len);
+
+  len = 1024;
+  memset(buffer, 0xac, sizeof(buffer));
   ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
+  ok(len == 19, "len = %u\n", len);
+  ok(strlen(buffer) == 18, "strlen(buffer) = %u\n", lstrlenA(buffer));
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
   ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n");
@@ -403,6 +415,18 @@ static void test_complicated_cookie(void)
   ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
 
   len = 1024;
+  ret = InternetGetCookieW(testing_example_comW, NULL, NULL, &len);
+  ok(ret == TRUE,"InternetGetCookieW failed\n");
+  ok(len == 38, "len = %u\n", len);
+
+  len = 1024;
+  memset(wbuf, 0xac, sizeof(wbuf));
+  ret = InternetGetCookieW(testing_example_comW, NULL, wbuf, &len);
+  ok(ret == TRUE,"InternetGetCookieW failed\n");
+  ok(len == 19, "len = %u\n", len);
+  ok(lstrlenW(wbuf) == 18, "strlenW(wbuf) = %u\n", lstrlenW(wbuf));
+
+  len = 1024;
   ret = InternetGetCookie("http://testing.example.com/foobar", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
@@ -465,6 +489,7 @@ static void test_complicated_cookie(void)
   len = 1024;
   ret = InternetGetCookie("http://testing.example.com/bar/foo", NULL, buffer, &len);
   ok(ret == TRUE,"InternetGetCookie failed\n");
+  ok(len == 24, "len = %u\n", 24);
   ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n");
   ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n");
   ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n");
@@ -474,6 +499,12 @@ 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");
 
+  /* Cookie name argument is not implemented */
+  len = 1024;
+  ret = InternetGetCookie("http://testing.example.com/bar/foo", "A", buffer, &len);
+  ok(ret == TRUE,"InternetGetCookie failed\n");
+  ok(len == 24, "len = %u\n", 24);
+
   /* test persistent cookies */
   ret = InternetSetCookie("http://testing.example.com", NULL, "A=B; expires=Fri, 01-Jan-2038 00:00:00 GMT");
   ok(ret, "InternetSetCookie failed with error %d\n", GetLastError());




More information about the wine-cvs mailing list