Hans Leidekker : wininet: Handle NULL input string in str_to_buffer.
Alexandre Julliard
julliard at winehq.org
Wed Jul 31 15:31:34 CDT 2013
Module: wine
Branch: master
Commit: 0c9321eb0f45ca3cd32da116b74c205e7b2127da
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c9321eb0f45ca3cd32da116b74c205e7b2127da
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Jul 30 11:09:19 2013 +0200
wininet: Handle NULL input string in str_to_buffer.
---
dlls/wininet/http.c | 17 ++++++++--
dlls/wininet/tests/http.c | 73 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 87 insertions(+), 3 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index c77f77a..b6ed7df 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2032,24 +2032,35 @@ static DWORD str_to_buffer(const WCHAR *str, void *buffer, DWORD *size, BOOL uni
int len;
if (unicode)
{
- len = strlenW(str);
+ WCHAR *buf = buffer;
+
+ if (str) len = strlenW(str);
+ else len = 0;
if (*size < (len + 1) * sizeof(WCHAR))
{
*size = (len + 1) * sizeof(WCHAR);
return ERROR_INSUFFICIENT_BUFFER;
}
- strcpyW(buffer, str);
+ if (str) strcpyW(buf, str);
+ else buf[0] = 0;
+
*size = len;
return ERROR_SUCCESS;
}
else
{
- len = WideCharToMultiByte(CP_ACP, 0, str, -1, buffer, *size, NULL, NULL);
+ char *buf = buffer;
+
+ if (str) len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
+ else len = 1;
if (*size < len)
{
*size = len;
return ERROR_INSUFFICIENT_BUFFER;
}
+ if (str) WideCharToMultiByte(CP_ACP, 0, str, -1, buf, *size, NULL, NULL);
+ else buf[0] = 0;
+
*size = len - 1;
return ERROR_SUCCESS;
}
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 458554f..f04fc7b 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -2249,6 +2249,71 @@ static void test_proxy_direct(int port)
hr = HttpOpenRequest(hc, NULL, "/test2", NULL, NULL, NULL, 0, 0);
ok(hr != NULL, "HttpOpenRequest failed\n");
+ sz = 0;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, NULL, &sz);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError());
+ ok(!r, "unexpected success\n");
+ ok(sz == 1, "got %u\n", sz);
+
+ sz = 0;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, NULL, &sz);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError());
+ ok(!r, "unexpected success\n");
+ ok(sz == 1, "got %u\n", sz);
+
+ sz = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, buffer, &sz);
+ ok(r, "unexpected failure %u\n", GetLastError());
+ ok(!sz, "got %u\n", sz);
+
+ sz = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz);
+ ok(r, "unexpected failure %u\n", GetLastError());
+ ok(!sz, "got %u\n", sz);
+
+ sz = 0;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, NULL, &sz);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError());
+ ok(!r, "unexpected success\n");
+ ok(sz == 1, "got %u\n", sz);
+
+ sz = 0;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, NULL, &sz);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError());
+ ok(!r, "unexpected success\n");
+ ok(sz == 1, "got %u\n", sz);
+
+ sz = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, buffer, &sz);
+ ok(r, "unexpected failure %u\n", GetLastError());
+ ok(!sz, "got %u\n", sz);
+
+ sz = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, buffer, &sz);
+ ok(r, "unexpected failure %u\n", GetLastError());
+ ok(!sz, "got %u\n", sz);
+
+ sz = 0;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_URL, NULL, &sz);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError());
+ ok(!r, "unexpected success\n");
+ ok(sz == 34, "got %u\n", sz);
+
+ sz = sizeof(buffer);
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_URL, buffer, &sz);
+ ok(r, "unexpected failure %u\n", GetLastError());
+ ok(sz == 33, "got %u\n", sz);
+
r = HttpSendRequest(hr, NULL, 0, NULL, 0);
ok(r || broken(!r), "HttpSendRequest failed %u\n", GetLastError());
if (!r)
@@ -2270,6 +2335,14 @@ static void test_proxy_direct(int port)
ok(r, "failed to set user\n");
buffer[0] = 0;
+ sz = 3;
+ SetLastError(0xdeadbeef);
+ r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz);
+ ok(!r, "unexpected failure %u\n", GetLastError());
+ ok(!buffer[0], "got %s\n", buffer);
+ ok(sz == strlen(username) + 1, "got %u\n", sz);
+
+ buffer[0] = 0;
sz = 0;
SetLastError(0xdeadbeef);
r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz);
More information about the wine-cvs
mailing list