Module: wine Branch: master Commit: d7a8beb0f766d2cbbbf682ca8846ce6ab96ca855 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7a8beb0f766d2cbbbf682ca88...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Fri Dec 5 02:26:34 2014 -0200
ws2_32: Filter unset bits when argument is smaller than 32 bits.
---
dlls/ws2_32/socket.c | 1 + dlls/ws2_32/tests/sock.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index ebafed5..1864dfd 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -5013,6 +5013,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, { woptval= *((const INT16 *) optval); optval= (char*) &woptval; + woptval&= (1 << optlen * 8) - 1; optlen=sizeof(int); } fd = get_sock_fd( s, 0, NULL ); diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 52a4e1e..f0946c9 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1374,6 +1374,23 @@ todo_wine
closesocket(s);
+ /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */ + s = socket(AF_INET, SOCK_DGRAM, 0); + ok(s != INVALID_SOCKET, "Failed to create socket\n"); + size = sizeof(i); + for (i = 0; i < 4; i++) + { + int k, j; + const int tests[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d}; + err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &tests[i], i + 1); + ok(!err, "Test [%d] Expected 0, got %d\n", i, err); + err = getsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &k, &size); + ok(!err, "Test [%d] Expected 0, got %d\n", i, err); + j = i != 3 ? tests[i] & ((1 << (i + 1) * 8) - 1) : tests[i]; + ok(k == j, "Test [%d] Expected 0x%x, got 0x%x\n", i, j, k); + } + closesocket(s); + /* test SO_PROTOCOL_INFOA invalid parameters */ ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL), "getsockopt should have failed\n");