From aa4572b613c8c34ad5a31165e4a53eec51fc1d07 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 15 Jan 2026 05:26:44 +0700 Subject: [PATCH] Append inner_af_unix with null, workaround unix dgram getpeername --- src/platform/redox/socket.rs | 15 ++++++++++++--- tests/sys_socket/unixpeername.c | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index ef6d478550..322419936c 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -16,8 +16,8 @@ use crate::{ header::{ arpa_inet::inet_aton, errno::{ - EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EISCONN, EMSGSIZE, ENOMEM, ENOSYS, ENOTSOCK, - EOPNOTSUPP, EPROTONOSUPPORT, + EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EISCONN, EMSGSIZE, ENOMEM, ENOSYS, ENOTCONN, + ENOTSOCK, EOPNOTSUPP, EPROTONOSUPPORT, }, netinet_in::{in_addr, in_port_t, sockaddr_in}, string::strnlen, @@ -96,6 +96,9 @@ unsafe fn inner_af_unix(buf: &[u8], address: *mut sockaddr, address_len: *mut so let len = cmp::min(path.len(), buf.len()); path[..len].copy_from_slice(&buf[..len]); + if len < path.len() { + path[len] = 0; + } *address_len = len as socklen_t; } @@ -772,7 +775,13 @@ impl PalSocket for Sys { if address.is_null() || address_len.is_null() { Self::read(socket, slice::from_raw_parts_mut(buf as *mut u8, len)) } else { - Self::getpeername(socket, address, address_len)?; + // TODO: in UDS dgram getpeername on listener always return ENOTCONN, + // it probably the expected error on usual getpeername call, but not here. + if let Err(e) = Self::getpeername(socket, address, address_len) { + let data = &mut *(address as *mut sockaddr); + data.sa_family = AF_UNSPEC as u16; + *address_len = 0; + } Self::read(socket, slice::from_raw_parts_mut(buf as *mut u8, len)) } } diff --git a/tests/sys_socket/unixpeername.c b/tests/sys_socket/unixpeername.c index aba4810930..4fb2fd041e 100644 --- a/tests/sys_socket/unixpeername.c +++ b/tests/sys_socket/unixpeername.c @@ -38,6 +38,7 @@ int main(void) status = bind(listen_fd, saddr, addr_len); ERROR_IF(bind, status, == -1); + // TODO: If this commented out, connect() should error with connection refused status = listen(listen_fd, 1); ERROR_IF(listen, status, == -1);