Alexandre Julliard : winhttp: Make WinHttpQueryHeaders behave the same way for all query types.

Alexandre Julliard julliard at winehq.org
Fri Aug 20 10:19:15 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Aug 20 16:06:04 2010 +0200

winhttp: Make WinHttpQueryHeaders behave the same way for all query types.

Based on a patch by Mikko Rasa.

---

 dlls/winhttp/request.c |   65 +++++++++++++++++++++--------------------------
 1 files changed, 29 insertions(+), 36 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 7c1205c..f6fc577 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -602,12 +602,12 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
         if (!(p = headers)) return FALSE;
         for (len = 0; *p; p++) if (*p != '\r') len++;
 
-        if ((len + 1) * sizeof(WCHAR) > *buflen || !buffer)
+        if (!buffer || (len + 1) * sizeof(WCHAR) > *buflen)
         {
             len++;
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
         }
-        else if (buffer)
+        else
         {
             for (p = headers, q = buffer; *p; p++, q++)
             {
@@ -637,12 +637,12 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
 
         if (!headers) return FALSE;
         len = strlenW( headers ) * sizeof(WCHAR);
-        if (len + sizeof(WCHAR) > *buflen || !buffer)
+        if (!buffer || len + sizeof(WCHAR) > *buflen)
         {
             len += sizeof(WCHAR);
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
         }
-        else if (buffer)
+        else
         {
             memcpy( buffer, headers, len + sizeof(WCHAR) );
             TRACE("returning data: %s\n", debugstr_wn(buffer, len / sizeof(WCHAR)));
@@ -653,43 +653,38 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
         return ret;
     }
     case WINHTTP_QUERY_VERSION:
-    {
-        DWORD len = (strlenW( request->version ) + 1) * sizeof(WCHAR);
-        if (len > *buflen)
+        len = strlenW( request->version ) * sizeof(WCHAR);
+        if (!buffer || len + sizeof(WCHAR) > *buflen)
         {
+            len += sizeof(WCHAR);
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
-            *buflen = len;
-            return FALSE;
         }
-        else if (buffer)
+        else
         {
             strcpyW( buffer, request->version );
             TRACE("returning string: %s\n", debugstr_w(buffer));
             ret = TRUE;
         }
-        *buflen = len - sizeof(WCHAR);
+        *buflen = len;
         return ret;
-    }
+
     case WINHTTP_QUERY_STATUS_TEXT:
-    {
-        DWORD len = (strlenW( request->status_text ) + 1) * sizeof(WCHAR);
-        if (len > *buflen)
+        len = strlenW( request->status_text ) * sizeof(WCHAR);
+        if (!buffer || len + sizeof(WCHAR) > *buflen)
         {
+            len += sizeof(WCHAR);
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
-            *buflen = len;
-            return FALSE;
         }
-        else if (buffer)
+        else
         {
             strcpyW( buffer, request->status_text );
             TRACE("returning string: %s\n", debugstr_w(buffer));
             ret = TRUE;
         }
-        *buflen = len - sizeof(WCHAR);
+        *buflen = len;
         return ret;
-    }
+
     default:
-    {
         if (attr >= sizeof(attribute_table)/sizeof(attribute_table[0]) || !attribute_table[attr])
         {
             FIXME("attribute %u not implemented\n", attr);
@@ -697,7 +692,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
         }
         TRACE("attribute %s\n", debugstr_w(attribute_table[attr]));
         header_index = get_header_index( request, attribute_table[attr], requested_index, request_only );
-    }
+        break;
     }
 
     if (header_index >= 0)
@@ -712,13 +707,13 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
     if (index) *index += 1;
     if (level & WINHTTP_QUERY_FLAG_NUMBER)
     {
-        int *number = buffer;
-        if (sizeof(int) > *buflen)
+        if (!buffer || sizeof(int) > *buflen)
         {
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
         }
-        else if (number)
+        else
         {
+            int *number = buffer;
             *number = atoiW( header->value );
             TRACE("returning number: %d\n", *number);
             ret = TRUE;
@@ -728,11 +723,11 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
     else if (level & WINHTTP_QUERY_FLAG_SYSTEMTIME)
     {
         SYSTEMTIME *st = buffer;
-        if (sizeof(SYSTEMTIME) > *buflen)
+        if (!buffer || sizeof(SYSTEMTIME) > *buflen)
         {
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
         }
-        else if (st && (ret = WinHttpTimeToSystemTime( header->value, st )))
+        else if ((ret = WinHttpTimeToSystemTime( header->value, st )))
         {
             TRACE("returning time: %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n",
                   st->wYear, st->wMonth, st->wDay, st->wDayOfWeek,
@@ -742,21 +737,19 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
     }
     else if (header->value)
     {
-        WCHAR *string = buffer;
-        DWORD len = (strlenW( header->value ) + 1) * sizeof(WCHAR);
-        if (len > *buflen)
+        len = strlenW( header->value ) * sizeof(WCHAR);
+        if (!buffer || len + sizeof(WCHAR) > *buflen)
         {
+            len += sizeof(WCHAR);
             set_last_error( ERROR_INSUFFICIENT_BUFFER );
-            *buflen = len;
-            return FALSE;
         }
-        else if (string)
+        else
         {
-            strcpyW( string, header->value );
-            TRACE("returning string: %s\n", debugstr_w(string));
+            strcpyW( buffer, header->value );
+            TRACE("returning string: %s\n", debugstr_w(buffer));
             ret = TRUE;
         }
-        *buflen = len - sizeof(WCHAR);
+        *buflen = len;
     }
     return ret;
 }




More information about the wine-cvs mailing list