André Hentschel : ws2_32: Handle null pointer for linger values.
Alexandre Julliard
julliard at winehq.org
Tue Jun 21 12:25:41 CDT 2011
Module: wine
Branch: master
Commit: dc16a01fdffc7f2b5c56deb15ecf5ad28c8d8c98
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dc16a01fdffc7f2b5c56deb15ecf5ad28c8d8c98
Author: André Hentschel <nerv at dawncrow.de>
Date: Mon Jun 20 23:00:03 2011 +0200
ws2_32: Handle null pointer for linger values.
---
dlls/ws2_32/socket.c | 12 ++++++++++--
dlls/ws2_32/tests/sock.c | 17 +++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 0c51985..43134af 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 29c97e2..24799cf 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);
More information about the wine-cvs
mailing list