ws2_32: Handle null pointer for linger values.

This commit is contained in:
André Hentschel 2011-06-20 23:00:03 +02:00 committed by Alexandre Julliard
parent 8db18a893b
commit dc16a01fdf
2 changed files with 27 additions and 2 deletions

View file

@ -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;

View file

@ -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);