Zebediah Figura : server: Clear FD_OOB instead of FD_READ when receiving OOB data.

Alexandre Julliard julliard at winehq.org
Thu May 27 16:02:09 CDT 2021


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed May 26 23:36:49 2021 -0500

server: Clear FD_OOB instead of FD_READ when receiving OOB data.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/socket.c       | 1 +
 include/wine/server_protocol.h | 4 ++--
 server/protocol.def            | 1 +
 server/request.h               | 1 +
 server/sock.c                  | 4 ++--
 server/trace.c                 | 3 ++-
 6 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 0812ec4970f..eb278096b43 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -223,6 +223,7 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi
         req->status = status;
         req->total  = information;
         req->async  = server_async( handle, &async->io, event, apc, apc_user, io );
+        req->oob    = !!(unix_flags & MSG_OOB);
         status = wine_server_call( req );
         wait_handle = wine_server_ptr_handle( reply->wait );
         options     = reply->options;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 730bb3c151c..771a3fb7d75 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1808,7 +1808,7 @@ struct set_socket_deferred_reply
 struct recv_socket_request
 {
     struct request_header __header;
-    char __pad_12[4];
+    int          oob;
     async_data_t async;
     unsigned int status;
     unsigned int total;
@@ -6287,7 +6287,7 @@ union generic_reply
 
 /* ### protocol_version begin ### */
 
-#define SERVER_PROTOCOL_VERSION 706
+#define SERVER_PROTOCOL_VERSION 707
 
 /* ### protocol_version end ### */
 
diff --git a/server/protocol.def b/server/protocol.def
index f0a9107cfbe..88e5ad6a96b 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1468,6 +1468,7 @@ enum server_fd_type
 
 /* Perform a recv on a socket */
 @REQ(recv_socket)
+    int          oob;           /* are we receiving OOB data? */
     async_data_t async;         /* async I/O parameters */
     unsigned int status;        /* status of initial call */
     unsigned int total;         /* number of bytes already read */
diff --git a/server/request.h b/server/request.h
index bb261958f59..b600a9660b2 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1068,6 +1068,7 @@ C_ASSERT( sizeof(struct enable_socket_event_request) == 32 );
 C_ASSERT( FIELD_OFFSET(struct set_socket_deferred_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct set_socket_deferred_request, deferred) == 16 );
 C_ASSERT( sizeof(struct set_socket_deferred_request) == 24 );
+C_ASSERT( FIELD_OFFSET(struct recv_socket_request, oob) == 12 );
 C_ASSERT( FIELD_OFFSET(struct recv_socket_request, async) == 16 );
 C_ASSERT( FIELD_OFFSET(struct recv_socket_request, status) == 56 );
 C_ASSERT( FIELD_OFFSET(struct recv_socket_request, total) == 60 );
diff --git a/server/sock.c b/server/sock.c
index 549cde17296..04e27328d80 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2452,8 +2452,8 @@ DECL_HANDLER(recv_socket)
     /* are we shut down? */
     if (status == STATUS_PENDING && !(sock->state & FD_READ)) status = STATUS_PIPE_DISCONNECTED;
 
-    sock->pending_events &= ~FD_READ;
-    sock->reported_events &= ~FD_READ;
+    sock->pending_events &= ~(req->oob ? FD_OOB : FD_READ);
+    sock->reported_events &= ~(req->oob ? FD_OOB : FD_READ);
 
     if ((async = create_request_async( fd, get_fd_comp_flags( fd ), &req->async )))
     {
diff --git a/server/trace.c b/server/trace.c
index 1420f1e799f..efa263eadec 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2124,7 +2124,8 @@ static void dump_set_socket_deferred_request( const struct set_socket_deferred_r
 
 static void dump_recv_socket_request( const struct recv_socket_request *req )
 {
-    dump_async_data( " async=", &req->async );
+    fprintf( stderr, " oob=%d", req->oob );
+    dump_async_data( ", async=", &req->async );
     fprintf( stderr, ", status=%08x", req->status );
     fprintf( stderr, ", total=%08x", req->total );
 }




More information about the wine-cvs mailing list