wininet: Fix buffer size query for HttpQueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF).
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 24918fc..a70bcff 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2197,27 +2197,26 @@
{
LPWSTR headers;
DWORD len;
- BOOL ret;
+ BOOL ret = FALSE;
if (request_only)
headers = HTTP_BuildHeaderRequestString(lpwhr, lpwhr->lpszVerb, lpwhr->lpszPath, lpwhr->lpszVersion);
else
headers = lpwhr->lpszRawHeaders;
- len = strlenW(headers);
- if (len + 1 > *lpdwBufferLength/sizeof(WCHAR))
+ len = (strlenW(headers) + 1) * sizeof(WCHAR);
+ if (len > *lpdwBufferLength)
{
- *lpdwBufferLength = (len + 1) * sizeof(WCHAR);
INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
ret = FALSE;
- } else
+ }
+ else if (lpBuffer)
{
- memcpy(lpBuffer, headers, (len+1)*sizeof(WCHAR));
- *lpdwBufferLength = len * sizeof(WCHAR);
-
- TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len));
+ memcpy(lpBuffer, headers, len);
+ TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len / sizeof(WCHAR)));
ret = TRUE;
}
+ *lpdwBufferLength = len;
if (request_only)
HeapFree(GetProcessHeap(), 0, headers);
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index b946d3b..1cb9793 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -1848,10 +1848,15 @@
type = 0;
size = sizeof(type);
ret = InternetQueryOption(ctx.req, INTERNET_OPTION_HANDLE_TYPE, &type, &size);
- ok(ret, "HttpQueryInfo failed: %u\n", GetLastError());
+ ok(ret, "InternetQueryOption failed: %u\n", GetLastError());
ok(type == INTERNET_HANDLE_TYPE_HTTP_REQUEST,
"expected INTERNET_HANDLE_TYPE_HTTP_REQUEST, got %u\n", type);
+ size = 0;
+ ret = HttpQueryInfo(ctx.req, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &size, NULL);
+ ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "HttpQueryInfo failed\n");
+ ok(size > 0, "expected size > 0\n");
+
CloseHandle(ctx.event);
InternetCloseHandle(ctx.req);
InternetCloseHandle(ses);