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);