Module: wine Branch: master Commit: f877fe9ba4562edb19752b456b7bd908fd5dc95d URL: http://source.winehq.org/git/wine.git/?a=commit;h=f877fe9ba4562edb19752b456b...
Author: Jacek Caban jacek@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");