Module: wine Branch: master Commit: 1e7f89194cec6693cea3c4fdec5702d8ccaa7eba URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e7f89194cec6693cea3c4fdec...
Author: Dan Kegel dank@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");