Dan Kegel : wininet: HTTP_QUERY_RAW_HEADERS_CRLF length shouldn' t include nul.

Alexandre Julliard julliard at winehq.org
Thu Jul 31 07:18:17 CDT 2008


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

Author: Dan Kegel <dank at kegel.com>
Date:   Wed Jul 30 06:49:04 2008 -0700

wininet: HTTP_QUERY_RAW_HEADERS_CRLF length shouldn't include nul.

---

 dlls/wininet/http.c       |    7 ++++---
 dlls/wininet/tests/http.c |   30 ++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 2a78670..ba82a84 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2195,15 +2195,16 @@ static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLev
             else
                 headers = lpwhr->lpszRawHeaders;
 
-            len = (strlenW(headers) + 1) * sizeof(WCHAR);
-            if (len > *lpdwBufferLength)
+            len = strlenW(headers) * sizeof(WCHAR);
+            if (len + sizeof(WCHAR) > *lpdwBufferLength)
             {
+                len += sizeof(WCHAR);
                 INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
                 ret = FALSE;
             }
             else if (lpBuffer)
             {
-                memcpy(lpBuffer, headers, len);
+                memcpy(lpBuffer, headers, len + sizeof(WCHAR));
                 TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len / sizeof(WCHAR)));
                 ret = TRUE;
             }
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 8209b22..0c4483b 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -1072,7 +1072,9 @@ static void HttpHeaders_test(void)
     HINTERNET hConnect;
     HINTERNET hRequest;
     CHAR      buffer[256];
+    WCHAR     wbuffer[256];
     DWORD     len = 256;
+    DWORD     oldlen;
     DWORD     index = 0;
 
     hSession = InternetOpen("Wine Regression Test",
@@ -1150,19 +1152,47 @@ static void HttpHeaders_test(void)
     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected last error: %d\n", GetLastError());
     ok(len > 40, "Invalid length (exp. more than 40, got %d)\n", len);
     ok(index == 0, "Index was incremented\n");
+    oldlen = len;   /* bytes; at least long enough to hold buffer & nul */
 
 
     /* a working query */
     index = 0;
     len = sizeof(buffer);
+    memset(buffer, 'x', sizeof(buffer));
     ok(HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS,
                 buffer,&len,&index),"Unable to query header\n");
+    ok(len + sizeof(CHAR) <= oldlen, "Result longer than advertised\n");
+    ok((len < sizeof(buffer)-sizeof(CHAR)) && (buffer[len/sizeof(CHAR)] == 0),"No NUL at end\n");
+    ok(len == strlen(buffer) * sizeof(CHAR), "Length wrong\n");
     /* what's in the middle differs between Wine and Windows so currently we check only the beginning and the end */
     ok(strncmp(buffer, "POST /posttest.php HTTP/1", 25)==0, "Invalid beginning of headers string\n");
     ok(strcmp(buffer + strlen(buffer) - 4, "\r\n\r\n")==0, "Invalid end of headers string\n");
     ok(index == 0, "Index was incremented\n");
 
+    /* Like above two tests, but for W version */
 
+    index = 0;
+    len = 0;
+    SetLastError(0xdeadbeef);
+    ok(HttpQueryInfoW(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS,
+                NULL,&len,&index) == FALSE,"Query worked\n");
+    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected last error: %d\n", GetLastError());
+    ok(len > 80, "Invalid length (exp. more than 80, got %d)\n", len);
+    ok(index == 0, "Index was incremented\n");
+    oldlen = len;   /* bytes; at least long enough to hold buffer & nul */
+
+    /* a working query */
+    index = 0;
+    len = sizeof(wbuffer);
+    memset(wbuffer, 'x', sizeof(wbuffer));
+    ok(HttpQueryInfoW(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS,
+                wbuffer,&len,&index),"Unable to query header\n");
+    ok(len + sizeof(WCHAR) <= oldlen, "Result longer than advertised\n");
+    ok(len == lstrlenW(wbuffer) * sizeof(WCHAR), "Length wrong\n");
+    ok((len < sizeof(wbuffer)-sizeof(WCHAR)) && (wbuffer[len/sizeof(WCHAR)] == 0),"No NUL at end\n");
+    ok(index == 0, "Index was incremented\n");
+
+    /* end of W version tests */
 
     ok(HttpAddRequestHeaders(hRequest,"Warning:test2",-1,HTTP_ADDREQ_FLAG_ADD),
             "Failed to add duplicate header using HTTP_ADDREQ_FLAG_ADD\n");




More information about the wine-cvs mailing list