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