Module: wine Branch: master Commit: 12b604926e6c5a87cac6e4375f0718ecb665ecfe URL: https://gitlab.winehq.org/wine/wine/-/commit/12b604926e6c5a87cac6e4375f0718e...
Author: Paul Gofman pgofman@codeweavers.com Date: Mon Oct 31 12:50:58 2022 -0600
server: Make SO_REUSEADDR and SO_EXCLUSIVEADDRUSE mutually exclusive.
---
dlls/ws2_32/tests/sock.c | 4 ++-- server/sock.c | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 00f4327bb3b..44a1691950a 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -2353,7 +2353,7 @@ static void test_reuseaddr(void)
value = 1; rc = setsockopt(s1, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&value, sizeof(value)); - todo_wine ok(rc == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, "got rc %d, error %d.\n", rc, WSAGetLastError()); + ok(rc == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, "got rc %d, error %d.\n", rc, WSAGetLastError());
value = 0; rc = setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, (char*)&value, sizeof(value)); @@ -2364,7 +2364,7 @@ static void test_reuseaddr(void)
value = 1; rc = setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, (char*)&value, sizeof(value)); - todo_wine ok(rc == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, "got rc %d, error %d.\n", rc, WSAGetLastError()); + ok(rc == SOCKET_ERROR && WSAGetLastError() == WSAEINVAL, "got rc %d, error %d.\n", rc, WSAGetLastError());
closesocket(s1);
diff --git a/server/sock.c b/server/sock.c index 88215650757..141c5ea6d0a 100644 --- a/server/sock.c +++ b/server/sock.c @@ -3091,6 +3091,13 @@ static void sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) }
reuse = *(int *)get_req_data(); + + if (reuse && sock->exclusiveaddruse) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } + if (is_tcp_socket( sock )) ret = 0; else @@ -3116,6 +3123,11 @@ static void sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) }
exclusive = *(int *)get_req_data(); + if (exclusive && sock->reuseaddr) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } sock->exclusiveaddruse = !!exclusive; return; }