diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 0c519851b83..43134afb344 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -4026,6 +4026,11 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, * setsockopt follow below that.*/ case WS_SO_DONTLINGER: + if (!optval) + { + SetLastError(WSAEFAULT); + return SOCKET_ERROR; + } linger.l_onoff = *((const int*)optval) ? 0: 1; linger.l_linger = 0; level = SOL_SOCKET; @@ -4035,10 +4040,13 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, break; case WS_SO_LINGER: + if (!optval) + { + SetLastError(WSAEFAULT); + return SOCKET_ERROR; + } linger.l_onoff = ((LINGER*)optval)->l_onoff; linger.l_linger = ((LINGER*)optval)->l_linger; - /* FIXME: what is documented behavior if SO_LINGER optval - is null?? */ level = SOL_SOCKET; optname = SO_LINGER; optval = (char*)&linger; diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 29c97e254a6..24799cf0d6a 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1139,6 +1139,23 @@ static void test_set_getsockopt(void) lingval.l_onoff, lingval.l_linger, linger_testvals[i].l_onoff, linger_testvals[i].l_linger); } + + size = sizeof(lingval); + err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, size); + ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, + "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); + err = setsockopt(s, SOL_SOCKET, SO_LINGER, NULL, 0); + ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, + "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); + + size = sizeof(BOOL); + err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, size); + ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, + "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); + err = setsockopt(s, SOL_SOCKET, SO_DONTLINGER, NULL, 0); + ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT, + "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError()); + /* Test for erroneously passing a value instead of a pointer as optval */ size = sizeof(char); err = setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)1, size);