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