File 0004-server-Fix-getsockname-and-accept-on-AF_UNIX-sockets.patch of Package wine

From fc82aa449e95fd3d7ef9e9643dfd3f54292cfa82 Mon Sep 17 00:00:00 2001
From: Ally Sommers <dropbear.sh@gmail.com>
Date: Wed, 7 Jun 2023 09:30:53 +0000
Subject: [PATCH 4/8] server: Fix getsockname() and accept() on AF_UNIX
 sockets.

---
 server/sock.c | 72 ++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 60 insertions(+), 12 deletions(-)

diff --git a/server/sock.c b/server/sock.c
index f56fcae3876..191160562f6 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2155,11 +2155,32 @@ static struct sock *accept_socket( struct sock *sock )
         unix_len = sizeof(unix_addr);
         if (!getsockname( acceptfd, &unix_addr.addr, &unix_len ))
         {
-            acceptsock->addr_len = sockaddr_from_unix( &unix_addr, &acceptsock->addr.addr, sizeof(acceptsock->addr) );
+            if (sock->family == WS_AF_UNIX)
+            {
+                acceptsock->addr_len = sock->addr_len;
+                acceptsock->addr.un = sock->addr.un;
+            }
+            else
+            {
+                acceptsock->addr_len = sockaddr_from_unix( &unix_addr,
+                                                           &acceptsock->addr.addr,
+                                                           sizeof(acceptsock->addr) );
+            }
+
             if (!getpeername( acceptfd, &unix_addr.addr, &unix_len ))
-                acceptsock->peer_addr_len = sockaddr_from_unix( &unix_addr,
-                                                                &acceptsock->peer_addr.addr,
-                                                                sizeof(acceptsock->peer_addr) );
+            {
+                if (sock->family == WS_AF_UNIX)
+                {
+                    acceptsock->peer_addr_len = sizeof( sock->peer_addr.un );
+                    acceptsock->peer_addr.un = sock->peer_addr.un;
+                }
+                else
+                {
+                    acceptsock->peer_addr_len = sockaddr_from_unix( &unix_addr,
+                                                                    &acceptsock->peer_addr.addr,
+                                                                    sizeof(acceptsock->peer_addr) );
+                }
+            }
         }
     }
 
@@ -2219,11 +2240,31 @@ static int accept_into_socket( struct sock *sock, struct sock *acceptsock )
     unix_len = sizeof(unix_addr);
     if (!getsockname( get_unix_fd( newfd ), &unix_addr.addr, &unix_len ))
     {
-        acceptsock->addr_len = sockaddr_from_unix( &unix_addr, &acceptsock->addr.addr, sizeof(acceptsock->addr) );
+        if (sock->family == WS_AF_UNIX)
+        {
+            acceptsock->addr_len = sock->addr_len;
+            acceptsock->addr.un = sock->addr.un;
+        }
+        else
+        {
+            acceptsock->addr_len = sockaddr_from_unix( &unix_addr,
+                                                       &acceptsock->addr.addr,
+                                                       sizeof(acceptsock->addr) );
+        }
         if (!getpeername( get_unix_fd( newfd ), &unix_addr.addr, &unix_len ))
-            acceptsock->peer_addr_len = sockaddr_from_unix( &unix_addr,
-                                                            &acceptsock->peer_addr.addr,
-                                                            sizeof(acceptsock->peer_addr) );
+        {
+            if (sock->family == WS_AF_UNIX)
+            {
+                acceptsock->peer_addr_len = sizeof( sock->peer_addr.un );
+                acceptsock->peer_addr.un = sock->peer_addr.un;
+            }
+            else
+            {
+                acceptsock->peer_addr_len = sockaddr_from_unix( &unix_addr,
+                                                                &acceptsock->peer_addr.addr,
+                                                                sizeof(acceptsock->peer_addr) );
+            }
+        }
     }
 
     clear_error();
@@ -2859,10 +2900,17 @@ static void sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
         allow_fd_caching( sock->fd );
 
         unix_len = sizeof(unix_addr);
-        getsockname( unix_fd, &unix_addr.addr, &unix_len );
-        sock->addr_len = sockaddr_from_unix( &unix_addr, &sock->addr.addr, sizeof(sock->addr) );
-        sock->peer_addr_len = sockaddr_from_unix( &peer_addr, &sock->peer_addr.addr, sizeof(sock->peer_addr));
-
+        if (sock->family == WS_AF_UNIX)
+        {
+            sock->peer_addr.un = *(struct WS_sockaddr_un *)addr;
+            sock->peer_addr_len = sizeof(struct WS_sockaddr_un);
+        }
+        else
+        {
+            getsockname( unix_fd, &unix_addr.addr, &unix_len );
+            sock->addr_len = sockaddr_from_unix( &unix_addr, &sock->addr.addr, sizeof(sock->addr) );
+            sock->peer_addr_len = sockaddr_from_unix( &peer_addr, &sock->peer_addr.addr, sizeof(sock->peer_addr));
+        }
         sock->bound = 1;
 
         if (!ret)
-- 
2.51.0

openSUSE Build Service is sponsored by