Paul Gofman : winhttp: Don't allow websocket send if another non-control send is pending.
Alexandre Julliard
julliard at winehq.org
Mon Feb 28 15:50:31 CST 2022
Module: wine
Branch: master
Commit: 11c835d4718aff84c8250084128f29a7fb7e7ef8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=11c835d4718aff84c8250084128f29a7fb7e7ef8
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Mon Feb 28 12:37:49 2022 +0100
winhttp: Don't allow websocket send if another non-control send is pending.
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 | 16 +++++++++++++++-
dlls/winhttp/winhttp_private.h | 1 +
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index d0732952e11..de011060236 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3349,6 +3349,7 @@ static void CALLBACK task_socket_send( TP_CALLBACK_INSTANCE *instance, void *ctx
else ret = socket_send( s->socket, s->type, s->buf, s->len, NULL );
send_io_complete( &s->socket->hdr );
+ InterlockedExchange( &s->socket->pending_noncontrol_send, 0 );
socket_send_complete( s->socket, ret, s->type, s->len );
release_object( &s->socket->hdr );
@@ -3386,8 +3387,16 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
BOOL async_send, complete_async = FALSE;
struct socket_send *s;
+ if (InterlockedCompareExchange( &socket->pending_noncontrol_send, 1, 0 ))
+ {
+ WARN( "Previous send is still queued.\n" );
+ release_object( &socket->hdr );
+ return ERROR_INVALID_OPERATION;
+ }
+
if (!(s = malloc( sizeof(*s) )))
{
+ InterlockedExchange( &socket->pending_noncontrol_send, 0 );
release_object( &socket->hdr );
return ERROR_OUTOFMEMORY;
}
@@ -3417,11 +3426,16 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
if ((ret = queue_task( &socket->send_q, task_socket_send, s )))
{
InterlockedDecrement( &socket->hdr.pending_sends );
+ InterlockedExchange( &socket->pending_noncontrol_send, 0 );
release_object( &socket->hdr );
free( s );
}
}
- else InterlockedDecrement( &socket->hdr.pending_sends );
+ else
+ {
+ InterlockedDecrement( &socket->hdr.pending_sends );
+ InterlockedExchange( &socket->pending_noncontrol_send, 0 );
+ }
ReleaseSRWLockExclusive( &socket->send_lock );
if (!async_send)
{
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 732f0afaa88..cf6655f561f 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -260,6 +260,7 @@ struct socket
unsigned int bytes_in_send_frame_buffer;
unsigned int client_buffer_offset;
SRWLOCK send_lock;
+ volatile LONG pending_noncontrol_send;
};
struct send_request
More information about the wine-cvs
mailing list