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