Hans Leidekker : winhttp: Read any data left in the request buffer for websocket connections.
Module: wine Branch: oldstable Commit: 5e855f33f53d477afd805c29d8cc6988d0d03fcc URL: https://source.winehq.org/git/wine.git/?a=commit;h=5e855f33f53d477afd805c29d... Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Sep 22 12:44:13 2021 +0200 winhttp: Read any data left in the request buffer for websocket connections. Fixes the case where a websocket server sends an unsolicited frame with the upgrade response. Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> (cherry picked from commit f738af16fbdab32d820f9ea0749da3397d5c1995) Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> --- 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 83af4edf792..9e932f49517 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -3288,9 +3288,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; }
participants (1)
-
Alexandre Julliard