[PATCH 1/5] ws2_32: Use Win32 getsockname() and getpeername() in SO_BSP_STATE.

Zebediah Figura z.figura12 at gmail.com
Tue Jun 22 10:24:11 CDT 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ws2_32/socket.c | 106 +++++++++++++++++--------------------------
 1 file changed, 41 insertions(+), 65 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 44c0690d535..71537e6a2d8 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2118,75 +2118,51 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
             return ret;
         case WS_SO_BSP_STATE:
         {
-            int req_size, addr_size;
+            CSADDR_INFO *csinfo = (CSADDR_INFO *)optval;
             WSAPROTOCOL_INFOW infow;
-            CSADDR_INFO *csinfo;
+            int addr_size;
 
-            ret = ws_protocol_info(s, TRUE, &infow, &addr_size);
-            if (ret)
+            if (!ws_protocol_info( s, TRUE, &infow, &addr_size ))
+                return -1;
+
+            if (infow.iAddressFamily == WS_AF_INET)
+                addr_size = sizeof(struct sockaddr_in);
+            else if (infow.iAddressFamily == WS_AF_INET6)
+                addr_size = sizeof(struct sockaddr_in6);
+            else
             {
-                if (infow.iAddressFamily == WS_AF_INET)
-                    addr_size = sizeof(struct sockaddr_in);
-                else if (infow.iAddressFamily == WS_AF_INET6)
-                    addr_size = sizeof(struct sockaddr_in6);
-                else
-                {
-                    FIXME("Family %d is unsupported for SO_BSP_STATE\n", infow.iAddressFamily);
-                    SetLastError(WSAEAFNOSUPPORT);
-                    return SOCKET_ERROR;
-                }
-
-                req_size = sizeof(CSADDR_INFO) + addr_size * 2;
-                if (*optlen < req_size)
-                {
-                    ret = 0;
-                    SetLastError(WSAEFAULT);
-                }
-                else
-                {
-                    union generic_unix_sockaddr uaddr;
-                    socklen_t uaddrlen;
-
-                    if ( (fd = get_sock_fd( s, 0, NULL )) == -1)
-                        return SOCKET_ERROR;
-
-                    csinfo = (CSADDR_INFO*) optval;
-
-                    /* Check if the sock is bound */
-                    if (is_fd_bound(fd, &uaddr, &uaddrlen) == 1)
-                    {
-                        csinfo->LocalAddr.lpSockaddr =
-                            (LPSOCKADDR) (optval + sizeof(CSADDR_INFO));
-                        ws_sockaddr_u2ws(&uaddr.addr, csinfo->LocalAddr.lpSockaddr, &addr_size);
-                        csinfo->LocalAddr.iSockaddrLength = addr_size;
-                    }
-                    else
-                    {
-                        csinfo->LocalAddr.lpSockaddr = NULL;
-                        csinfo->LocalAddr.iSockaddrLength = 0;
-                    }
-
-                    /* Check if the sock is connected */
-                    if (!getpeername(fd, &uaddr.addr, &uaddrlen) &&
-                        is_sockaddr_bound(&uaddr.addr, uaddrlen))
-                    {
-                        csinfo->RemoteAddr.lpSockaddr =
-                            (LPSOCKADDR) (optval + sizeof(CSADDR_INFO) + addr_size);
-                        ws_sockaddr_u2ws(&uaddr.addr, csinfo->RemoteAddr.lpSockaddr, &addr_size);
-                        csinfo->RemoteAddr.iSockaddrLength = addr_size;
-                    }
-                    else
-                    {
-                        csinfo->RemoteAddr.lpSockaddr = NULL;
-                        csinfo->RemoteAddr.iSockaddrLength = 0;
-                    }
-
-                    csinfo->iSocketType = infow.iSocketType;
-                    csinfo->iProtocol = infow.iProtocol;
-                    release_sock_fd( s, fd );
-                }
+                FIXME( "family %d is unsupported for SO_BSP_STATE\n", infow.iAddressFamily );
+                SetLastError( WSAEAFNOSUPPORT );
+                return -1;
             }
-            return ret ? 0 : SOCKET_ERROR;
+
+            if (*optlen < sizeof(CSADDR_INFO) + addr_size * 2)
+            {
+                ret = 0;
+                SetLastError( WSAEFAULT );
+                return -1;
+            }
+
+            csinfo->LocalAddr.lpSockaddr = (struct WS_sockaddr *)(csinfo + 1);
+            csinfo->RemoteAddr.lpSockaddr = (struct WS_sockaddr *)((char *)(csinfo + 1) + addr_size);
+
+            csinfo->LocalAddr.iSockaddrLength = addr_size;
+            if (WS_getsockname( s, csinfo->LocalAddr.lpSockaddr, &csinfo->LocalAddr.iSockaddrLength ) < 0)
+            {
+                csinfo->LocalAddr.lpSockaddr = NULL;
+                csinfo->LocalAddr.iSockaddrLength = 0;
+            }
+
+            csinfo->RemoteAddr.iSockaddrLength = addr_size;
+            if (WS_getpeername( s, csinfo->RemoteAddr.lpSockaddr, &csinfo->RemoteAddr.iSockaddrLength ) < 0)
+            {
+                csinfo->RemoteAddr.lpSockaddr = NULL;
+                csinfo->RemoteAddr.iSockaddrLength = 0;
+            }
+
+            csinfo->iSocketType = infow.iSocketType;
+            csinfo->iProtocol = infow.iProtocol;
+            return 0;
         }
         case WS_SO_DONTLINGER:
         {
-- 
2.30.2




More information about the wine-devel mailing list