On Do, 2009-08-20 at 17:58 +0200, Alexandre Julliard wrote:
> Juan Lang <juan.l...@gmail.com> writes:
> 
> > @@ -1779,6 +1779,8 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
> >      TRACE("socket: %04lx, level 0x%x, name 0x%x, ptr %p, len %d\n",
> >            s, level, optname, optval, *optlen);
> >  
> > +    /* Some apps sign-extend the level, so mask off the higher-order bits 
> > */
> > +    level &= 0x0000ffff;
> 
> There can be several other ways to handle this, it needs test cases to
> determine which way Windows is using.

When reading the log in the bug, the WSAAsyncGetHostByName16 is the
indicator for an 16bit app. 

Attached is my diff from last year for that code.

-- 
 
By by ... Detlef
diff --git a/dlls/ws2_32/socket16.c b/dlls/ws2_32/socket16.c
index b4b3fe8..c2bb444 100644
--- a/dlls/ws2_32/socket16.c
+++ b/dlls/ws2_32/socket16.c
@@ -294,8 +294,9 @@ INT16 WINAPI getsockopt16(SOCKET16 s, INT16 level, INT16 optname, char *optval,
     INT optlen32;
     INT *p = &optlen32;
     INT retVal;
+
     if( optlen ) optlen32 = *optlen; else p = NULL;
-    retVal = WS_getsockopt( s, level, optname, optval, p );
+    retVal = WS_getsockopt( s, level & 0xffff, optname, optval, p );
     if( optlen ) *optlen = optlen32;
     return retVal;
 }
@@ -397,7 +398,7 @@ INT16 WINAPI setsockopt16(SOCKET16 s, INT16 level, INT16 optname,
                           char *optval, INT16 optlen)
 {
     if( !optval ) return SOCKET_ERROR;
-    return WS_setsockopt( s, level, optname, optval, optlen );
+    return WS_setsockopt( s, level & 0xffff, optname, optval, optlen );
 }
 
 /***********************************************************************
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index e2d2162..782204d 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1807,12 +1807,21 @@ static void test_extendedSocketOptions(void)
         return;
     }
 
+    optval = 0xdeadbeef;
     ret = getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
+    trace("got %d with optval: 0x%x/%d\n", ret, optval, optval);
 
     ok(ret == 0, "getsockopt failed to query SO_MAX_MSG_SIZE, return value is 0x%08x\n", ret);
     ok((optval == 65507) || (optval == 65527),
             "SO_MAX_MSG_SIZE reported %d, expected 65507 or 65527\n", optval);
 
+    /* IE 3 use 0xffffffff instead of SOL_SOCKET (0xffff) */
+    optval = 0xdeadbeef;
+    ret = getsockopt(sock, 0xffffffff, SO_MAX_MSG_SIZE, (char *)&optval, &optlen);
+    trace("got %d with optval: 0x%x/%d\n", ret, optval, optval);
+
+
+
     optlen = sizeof(LINGER);
     ret = getsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&linger_val, &optlen);
     todo_wine{


Reply via email to