[PATCH] ws2_32: hardcode optlen to 4 for setsockopt in the TCP_NODELAY case

Alex Henrie alexhenrie24 at gmail.com
Mon Nov 29 16:15:50 CST 2021


Hello Bastien, welcome to the Wine project, and thanks for the patch!
I have some feedback.

On Mon, Nov 29, 2021 at 2:41 PM Bastien Orivel <eijebong at bananium.fr> wrote:
>
> @@ -2868,7 +2868,7 @@ int WINAPI setsockopt( SOCKET s, int level, int optname, const char *optval, int
>          switch(optname)
>          {
>          case TCP_NODELAY:
> -            return server_setsockopt( s, IOCTL_AFD_WINE_SET_TCP_NODELAY, optval, optlen );
> +            return server_setsockopt( s, IOCTL_AFD_WINE_SET_TCP_NODELAY, optval, 4 );

Couldn't it cause a segfault to call setsockopt on a single-byte value
when setsockopt expects four bytes to be there? I think we want
something like:

case TCP_NODELAY:
{
    INT nodelay = optval[1];
    return server_setsockopt( s, IOCTL_AFD_WINE_SET_TCP_NODELAY,
nodelay, sizeof(nodelay) );
}

> @@ -1259,6 +1259,15 @@ static void test_set_getsockopt(void)
>      ok(err == SOCKET_ERROR && WSAGetLastError() == WSAEFAULT,
>         "got %d with %d (expected SOCKET_ERROR with WSAEFAULT)\n", err, WSAGetLastError());
>
> +    /* TCP_NODELAY: optlen doesn't matter on windows, it should work with any value */
> +    value = 1;
> +    err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 1);
> +    ok (!err, "setsockopt TCP_NODELAY failed with optlen == 1\n");
> +    err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 4);
> +    ok (!err, "setsockopt TCP_NODELAY failed with optlen == 4\n");
> +    err = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&value, 42);
> +    ok (!err, "setsockopt TCP_NODELAY failed with optlen == 42\n");

What happens if the length is zero or negative? Or if the length is 4
but the value is 0x100 (no bits set in the first byte but a bit is set
in the second byte)? I think we need tests for those cases too.

-Alex



More information about the wine-devel mailing list