From 0c9321eb0f45ca3cd32da116b74c205e7b2127da Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 30 Jul 2013 11:09:19 +0200 Subject: [PATCH] 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 c77f77a6524..b6ed7dfa265 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 458554f8c1a..f04fc7babda 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); -- 2.11.4.GIT