[PATCH 2/3] winhttp: Read any data left in the request buffer for websocket connections.

Hans Leidekker hans at codeweavers.com
Wed Sep 22 05:44:13 CDT 2021


Fixes the case where a websocket server sends an unsolicited frame with the upgrade response.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/winhttp/request.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 85b6db6c8e0..028be61a172 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3306,9 +3306,20 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
 
 static DWORD receive_bytes( struct socket *socket, char *buf, DWORD len, DWORD *ret_len )
 {
-    DWORD err;
-    if ((err = netconn_recv( socket->request->netconn, buf, len, 0, (int *)ret_len ))) return err;
-    if (*ret_len != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
+    DWORD err, size = 0, needed = len;
+    char *ptr = buf;
+    int received;
+
+    if (socket->request->read_size)
+    {
+        size = min( needed, socket->request->read_size );
+        memcpy( ptr, socket->request->read_buf + socket->request->read_pos, size );
+        remove_data( socket->request, size );
+        needed -= size;
+        ptr += size;
+    }
+    if ((err = netconn_recv( socket->request->netconn, ptr, needed, 0, &received ))) return err;
+    if ((*ret_len = size + received) != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
     return ERROR_SUCCESS;
 }
 
-- 
2.30.2




More information about the wine-devel mailing list