Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v2: winhttp: Fix error handling when returning string options. winhttp/tests: Add some tests for querying string options with NULL buffer.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/winhttp/tests/winhttp.c | 104 +++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+)
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 2252551f32c..4ca307301ef 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -4369,12 +4369,28 @@ static void test_credentials(void) ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(!size, "expected 0, got %lu\n", size);
+ size = 4; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == 2, "Unexpected size %lu\n", size); + size = ARRAY_SIZE(buffer); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, &buffer, &size); ok(ret, "failed to query proxy password %lu\n", GetLastError()); ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(!size, "expected 0, got %lu\n", size);
+ size = 4; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == 2, "Unexpected size %lu\n", size); + ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_USERNAME, proxy_userW, lstrlenW(proxy_userW)); ok(ret, "failed to set username %lu\n", GetLastError());
@@ -4384,18 +4400,52 @@ static void test_credentials(void) ok(!wcscmp(buffer, proxy_userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(proxy_userW) * sizeof(WCHAR), "unexpected result %lu\n", size);
+ buffer[0] = 0x1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, &buffer, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); + todo_wine + ok(size == (lstrlenW(proxy_userW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size); + + size = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == (lstrlenW(proxy_userW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size); + size = ARRAY_SIZE(buffer); ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, &buffer, &size); ok(ret, "failed to query username %lu\n", GetLastError()); ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(!size, "expected 0, got %lu\n", size);
+ size = 4; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == 2, "Unexpected size %lu\n", size); + size = ARRAY_SIZE(buffer); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, &buffer, &size); ok(ret, "failed to query password %lu\n", GetLastError()); ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(!size, "expected 0, got %lu\n", size);
+ size = 4; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == 2, "Unexpected size %lu\n", size); + ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_PASSWORD, proxy_passW, lstrlenW(proxy_passW)); ok(ret, "failed to set proxy password %lu\n", GetLastError());
@@ -4405,6 +4455,24 @@ static void test_credentials(void) ok(!wcscmp(buffer, proxy_passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(proxy_passW) * sizeof(WCHAR), "unexpected result %lu\n", size);
+ buffer[0] = 0x1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, &buffer, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); + todo_wine + ok(size == (lstrlenW(proxy_passW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size); + + size = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == (lstrlenW(proxy_passW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size); + ret = WinHttpSetOption(req, WINHTTP_OPTION_USERNAME, userW, lstrlenW(userW)); ok(ret, "failed to set username %lu\n", GetLastError());
@@ -4414,6 +4482,24 @@ static void test_credentials(void) ok(!wcscmp(buffer, userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(userW) * sizeof(WCHAR), "unexpected result %lu\n", size);
+ buffer[0] = 0x1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, &buffer, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); + todo_wine + ok(size == (lstrlenW(userW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size); + + size = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == (lstrlenW(userW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size); + ret = WinHttpSetOption(req, WINHTTP_OPTION_PASSWORD, passW, lstrlenW(passW)); ok(ret, "failed to set password %lu\n", GetLastError());
@@ -4423,6 +4509,24 @@ static void test_credentials(void) ok(!wcscmp(buffer, passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(passW) * sizeof(WCHAR), "unexpected result %lu\n", size);
+ buffer[0] = 0x1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, &buffer, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); + todo_wine + ok(size == (lstrlenW(passW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size); + + size = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, NULL, &size); + todo_wine + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); + todo_wine + ok(size == (lstrlenW(passW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size); + WinHttpCloseHandle(req);
req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/winhttp/session.c | 32 ++++++++++++++++++-------------- dlls/winhttp/tests/winhttp.c | 28 ---------------------------- 2 files changed, 18 insertions(+), 42 deletions(-)
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 74c8d973f35..a473451b9a6 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -681,16 +681,24 @@ static void request_destroy( struct object_header *hdr ) free( request ); }
-static void str_to_buffer( WCHAR *buffer, const WCHAR *str, LPDWORD buflen ) +static BOOL return_string_option( WCHAR *buffer, const WCHAR *str, LPDWORD buflen ) { - int len = 0; - if (str) len = lstrlenW( str ); + int len = sizeof(WCHAR); + if (str) len += lstrlenW( str ) * sizeof(WCHAR); if (buffer && *buflen > len) { - if (str) memcpy( buffer, str, len * sizeof(WCHAR) ); - buffer[len] = 0; + if (str) memcpy( buffer, str, len ); + len -= sizeof(WCHAR); + buffer[len / sizeof(WCHAR)] = 0; + *buflen = len; + return TRUE; + } + else + { + *buflen = len; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; } - *buflen = len * sizeof(WCHAR); }
static WCHAR *blob_to_str( DWORD encoding, CERT_NAME_BLOB *blob ) @@ -868,20 +876,16 @@ static BOOL request_query_option( struct object_header *hdr, DWORD option, void return TRUE;
case WINHTTP_OPTION_USERNAME: - str_to_buffer( buffer, request->connect->username, buflen ); - return TRUE; + return return_string_option( buffer, request->connect->username, buflen );
case WINHTTP_OPTION_PASSWORD: - str_to_buffer( buffer, request->connect->password, buflen ); - return TRUE; + return return_string_option( buffer, request->connect->password, buflen );
case WINHTTP_OPTION_PROXY_USERNAME: - str_to_buffer( buffer, request->connect->session->proxy_username, buflen ); - return TRUE; + return return_string_option( buffer, request->connect->session->proxy_username, buflen );
case WINHTTP_OPTION_PROXY_PASSWORD: - str_to_buffer( buffer, request->connect->session->proxy_password, buflen ); - return TRUE; + return return_string_option( buffer, request->connect->session->proxy_password, buflen );
case WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS: if (!validate_buffer( buffer, buflen, sizeof(DWORD) )) return FALSE; diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 4ca307301ef..03b1c067fb5 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -4372,9 +4372,7 @@ static void test_credentials(void) size = 4; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == 2, "Unexpected size %lu\n", size);
size = ARRAY_SIZE(buffer); @@ -4386,9 +4384,7 @@ static void test_credentials(void) size = 4; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == 2, "Unexpected size %lu\n", size);
ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_USERNAME, proxy_userW, lstrlenW(proxy_userW)); @@ -4403,19 +4399,14 @@ static void test_credentials(void) buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, &buffer, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); - todo_wine ok(size == (lstrlenW(proxy_userW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size);
size = 0; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == (lstrlenW(proxy_userW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size);
size = ARRAY_SIZE(buffer); @@ -4427,9 +4418,7 @@ static void test_credentials(void) size = 4; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == 2, "Unexpected size %lu\n", size);
size = ARRAY_SIZE(buffer); @@ -4441,9 +4430,7 @@ static void test_credentials(void) size = 4; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == 2, "Unexpected size %lu\n", size);
ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_PASSWORD, proxy_passW, lstrlenW(proxy_passW)); @@ -4458,19 +4445,14 @@ static void test_credentials(void) buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, &buffer, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); - todo_wine ok(size == (lstrlenW(proxy_passW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size);
size = 0; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == (lstrlenW(proxy_passW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size);
ret = WinHttpSetOption(req, WINHTTP_OPTION_USERNAME, userW, lstrlenW(userW)); @@ -4485,19 +4467,14 @@ static void test_credentials(void) buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, &buffer, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); - todo_wine ok(size == (lstrlenW(userW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size);
size = 0; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == (lstrlenW(userW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size);
ret = WinHttpSetOption(req, WINHTTP_OPTION_PASSWORD, passW, lstrlenW(passW)); @@ -4512,19 +4489,14 @@ static void test_credentials(void) buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, &buffer, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(*buffer == 0x1, "unexpected result %s\n", wine_dbgstr_w(buffer)); - todo_wine ok(size == (lstrlenW(passW) + 1) * sizeof(WCHAR), "unexpected result %lu\n", size);
size = 0; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, NULL, &size); - todo_wine ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected error %lu\n", GetLastError()); - todo_wine ok(size == (lstrlenW(passW) + 1) * sizeof(WCHAR), "Unexpected size %lu\n", size);
WinHttpCloseHandle(req);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=146904
Your paranoid android.
=== debian11b (64 bit WoW report) ===
ddraw: ddraw4.c:3962: Test failed: Expected message 0x5, but didn't receive it.
This merge request was approved by Hans Leidekker.