Hans Leidekker : wininet: Fix parsing of cookies with attributes.
Alexandre Julliard
julliard at winehq.org
Fri Apr 24 10:00:12 CDT 2009
Module: wine
Branch: master
Commit: fbc99515eb905094dd5d4d0f48eda0ecb752b4c8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fbc99515eb905094dd5d4d0f48eda0ecb752b4c8
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Apr 24 14:59:08 2009 +0200
wininet: Fix parsing of cookies with attributes.
---
dlls/wininet/cookie.c | 26 +++++++++++++++++++++-----
dlls/wininet/tests/internet.c | 9 +++++++++
2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index fdccd65..dc77b17 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -447,12 +447,12 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
cookie_domain *thisCookieDomain = NULL;
cookie *thisCookie;
struct list *cursor;
- LPWSTR data;
+ LPWSTR data, value;
WCHAR *ptr;
FILETIME expiry;
BOOL expired = FALSE;
- data = HeapAlloc(GetProcessHeap(),0,(lstrlenW(cookie_data)+1) * sizeof(WCHAR));
+ value = data = HeapAlloc(GetProcessHeap(), 0, (strlenW(cookie_data) + 1) * sizeof(WCHAR));
strcpyW(data,cookie_data);
memset(&expiry,0,sizeof(expiry));
@@ -469,6 +469,10 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
if (!(ptr = strchrW(ptr,';'))) break;
*ptr++ = 0;
+
+ value = HeapAlloc(GetProcessHeap(), 0, (ptr - data) * sizeof(WCHAR));
+ strcpyW(value, data);
+
while (*ptr == ' ') ptr++; /* whitespace */
if (strncmpiW(ptr, szDomain, 7) == 0)
@@ -502,11 +506,20 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
}
}
else if (strncmpiW(ptr, szSecure, 6) == 0)
+ {
FIXME("secure not handled (%s)\n",debugstr_w(ptr));
+ ptr += strlenW(szSecure);
+ }
else if (strncmpiW(ptr, szHttpOnly, 8) == 0)
+ {
FIXME("httponly not handled (%s)\n",debugstr_w(ptr));
- else
+ ptr += strlenW(szHttpOnly);
+ }
+ else if (*ptr)
+ {
FIXME("Unknown additional option %s\n",debugstr_w(ptr));
+ break;
+ }
}
LIST_FOR_EACH(cursor, &domain_list)
@@ -524,6 +537,7 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
else
{
HeapFree(GetProcessHeap(),0,data);
+ if (value != data) HeapFree(GetProcessHeap(), 0, value);
return TRUE;
}
}
@@ -532,15 +546,17 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
COOKIE_deleteCookie(thisCookie, FALSE);
TRACE("setting cookie %s=%s for domain %s path %s\n", debugstr_w(cookie_name),
- debugstr_w(data), debugstr_w(thisCookieDomain->lpCookieDomain),debugstr_w(thisCookieDomain->lpCookiePath));
+ debugstr_w(value), debugstr_w(thisCookieDomain->lpCookieDomain),debugstr_w(thisCookieDomain->lpCookiePath));
- if (!expired && !COOKIE_addCookie(thisCookieDomain, cookie_name,data, expiry))
+ if (!expired && !COOKIE_addCookie(thisCookieDomain, cookie_name, value, expiry))
{
HeapFree(GetProcessHeap(),0,data);
+ if (value != data) HeapFree(GetProcessHeap(), 0, value);
return FALSE;
}
HeapFree(GetProcessHeap(),0,data);
+ if (value != data) HeapFree(GetProcessHeap(), 0, value);
return TRUE;
}
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index 0ec7242..3c1b3da 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -272,6 +272,8 @@ static void test_complicated_cookie(void)
ok(ret == TRUE,"InternetSetCookie failed\n");
ret = InternetSetCookie("http://www.example.com/bar/",NULL,"M=N; domain=.example.com; path=/foo/");
ok(ret == TRUE,"InternetSetCookie failed\n");
+ ret = InternetSetCookie("http://www.example.com/bar/",NULL,"O=P; secure; path=/bar");
+ ok(ret == TRUE,"InternetSetCookie failed\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len);
@@ -282,6 +284,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/foobar", NULL, buffer, &len);
@@ -292,6 +295,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/foobar/", NULL, buffer, &len);
@@ -302,6 +306,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/foo/bar", NULL, buffer, &len);
@@ -312,6 +317,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")!=NULL,"M=N missing\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/barfoo", NULL, buffer, &len);
@@ -322,6 +328,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/barfoo/", NULL, buffer, &len);
@@ -332,6 +339,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")==NULL,"K=L present\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
len = 1024;
ret = InternetGetCookie("http://testing.example.com/bar/foo", NULL, buffer, &len);
@@ -342,6 +350,7 @@ static void test_complicated_cookie(void)
ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n");
ok(strstr(buffer,"K=L")!=NULL,"K=L missing\n");
ok(strstr(buffer,"M=N")==NULL,"M=N present\n");
+ ok(strstr(buffer,"O=P")==NULL,"O=P present\n");
}
static void test_null(void)
More information about the wine-cvs
mailing list