Module: wine Branch: master Commit: d35c13c621a157fcbb60ba4f44a5eab29cfb49be URL: http://source.winehq.org/git/wine.git/?a=commit;h=d35c13c621a157fcbb60ba4f44...
Author: Kai Blin kai.blin@gmail.com Date: Mon Nov 12 11:42:28 2007 +0100
ws2_32: Cope with buggy apps passing setsockopt optval as a value instead of a pointer.
---
dlls/ws2_32/socket.c | 7 +++++++ dlls/ws2_32/tests/sock.c | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 4c185d8..f4111cd 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2812,6 +2812,13 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, TRACE("socket: %04lx, level 0x%x, name 0x%x, ptr %p, len %d\n", s, level, optname, optval, optlen);
+ /* some broken apps pass the value directly instead of a pointer to it */ + if(IS_INTRESOURCE(optval)) + { + SetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + switch(level) { case WS_SOL_SOCKET: diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 8225f5f..858d0b5 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -850,7 +850,7 @@ LINGER linger_testvals[] = { static void test_set_getsockopt(void) { SOCKET s; - int i, err; + int i, err, lasterr; int timeout; LINGER lingval; int size; @@ -889,6 +889,15 @@ static void test_set_getsockopt(void) lingval.l_onoff, lingval.l_linger, linger_testvals[i].l_onoff, linger_testvals[i].l_linger); } + /* 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); + ok(err == SOCKET_ERROR, "setsockopt with optval being a value passed " + "instead of failing.\n"); + lasterr = WSAGetLastError(); + ok(lasterr == WSAEFAULT, "setsockopt with optval being a value " + "returned 0x%08x, not WSAEFAULT(0x%08x)\n", + lasterr, WSAEFAULT); closesocket(s); }