Paul Gofman : winhttp: Return error from WinHttpWebSocketQueryCloseStatus() if close frame was not received.

Alexandre Julliard julliard at winehq.org
Wed Jan 26 15:57:31 CST 2022


Module: wine
Branch: master
Commit: 68cb8a296500af0f2ef32e32f5592c3cd64618de
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=68cb8a296500af0f2ef32e32f5592c3cd64618de

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Wed Jan 26 15:25:23 2022 +0100

winhttp: Return error from WinHttpWebSocketQueryCloseStatus() if close frame was not received.

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winhttp/request.c            | 6 ++++++
 dlls/winhttp/tests/notification.c | 6 +++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 39223d41bbb..279e0522166 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3909,6 +3909,12 @@ DWORD WINAPI WinHttpWebSocketQueryCloseStatus( HINTERNET hsocket, USHORT *status
         return ERROR_INVALID_OPERATION;
     }
 
+    if (!socket->close_frame_received || socket->close_frame_receive_err)
+    {
+        ret = socket->close_frame_received ? socket->close_frame_receive_err : ERROR_INVALID_OPERATION;
+        release_object( &socket->hdr );
+        return ret;
+    }
     *status = socket->status;
     *ret_len = socket->reason_len;
     if (socket->reason_len > len) ret = ERROR_INSUFFICIENT_BUFFER;
diff --git a/dlls/winhttp/tests/notification.c b/dlls/winhttp/tests/notification.c
index c57c0ef598a..cab87df339d 100644
--- a/dlls/winhttp/tests/notification.c
+++ b/dlls/winhttp/tests/notification.c
@@ -971,9 +971,9 @@ static void test_websocket(BOOL secure)
     close_status = 0xdead;
     size = sizeof(buffer) + 1;
     err = pWinHttpWebSocketQueryCloseStatus( socket, &close_status, buffer, sizeof(buffer), &size );
-    todo_wine ok( err == ERROR_INVALID_OPERATION, "got %u\n", err );
-    todo_wine ok( close_status == 0xdead, "got %u\n", close_status );
-    todo_wine ok( size == sizeof(buffer) + 1, "got %u\n", size );
+    ok( err == ERROR_INVALID_OPERATION, "got %u\n", err );
+    ok( close_status == 0xdead, "got %u\n", close_status );
+    ok( size == sizeof(buffer) + 1, "got %u\n", size );
 
     WaitForSingleObject( info.wait, INFINITE );
 




More information about the wine-cvs mailing list