Hans Leidekker : wininet: Fix buffer size query for HttpQueryInfo( HTTP_QUERY_RAW_HEADERS_CRLF).

Alexandre Julliard julliard at winehq.org
Mon May 19 09:39:44 CDT 2008


Module: wine
Branch: master
Commit: 694a09284a8e5e3fa3782d7be5ab13074c0a6201
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=694a09284a8e5e3fa3782d7be5ab13074c0a6201

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Sun May 18 21:09:50 2008 +0200

wininet: Fix buffer size query for HttpQueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF).

---

 dlls/wininet/http.c       |   17 ++++++++---------
 dlls/wininet/tests/http.c |    7 ++++++-
 2 files changed, 14 insertions(+), 10 deletions(-)

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 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev
         {
             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 @@ static void test_open_url_async(void)
     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);




More information about the wine-cvs mailing list