about summary refs log tree commit diff
path: root/library/std/src/os/unix/net
diff options
context:
space:
mode:
authorSebastien Marie <semarie@kapouay.eu.org>2024-04-11 08:43:38 +0000
committerSebastien Marie <semarie@kapouay.eu.org>2024-04-11 08:43:38 +0000
commit7aaad6b7e2c04f97c1f9472dfeecea9662a35bb4 (patch)
treebd91ac2c1e830864e2732eeca85202e8c2c899a5 /library/std/src/os/unix/net
parentf13f37fd7bbbc34c663311739176fe114ef51085 (diff)
downloadrust-7aaad6b7e2c04f97c1f9472dfeecea9662a35bb4.tar.gz
rust-7aaad6b7e2c04f97c1f9472dfeecea9662a35bb4.zip
OpenBSD fix long socket addresses
Original diff from @notgull in #118349, small changes from me.

on OpenBSD, getsockname(2) returns the actual size of the socket address, and 
not the len of the content. Figure out the length for ourselves.
see https://marc.info/?l=openbsd-bugs&m=170105481926736&w=2

Fixes #116523
Diffstat (limited to 'library/std/src/os/unix/net')
-rw-r--r--library/std/src/os/unix/net/addr.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/library/std/src/os/unix/net/addr.rs b/library/std/src/os/unix/net/addr.rs
index 9757653e02c..1787eba0ef8 100644
--- a/library/std/src/os/unix/net/addr.rs
+++ b/library/std/src/os/unix/net/addr.rs
@@ -107,6 +107,16 @@ impl SocketAddr {
         addr: libc::sockaddr_un,
         mut len: libc::socklen_t,
     ) -> io::Result<SocketAddr> {
+        if cfg!(target_os = "openbsd") {
+            // on OpenBSD, getsockname(2) returns the actual size of the socket address,
+            // and not the len of the content. Figure out the length for ourselves.
+            // https://marc.info/?l=openbsd-bugs&m=170105481926736&w=2
+            let sun_path: &[u8] =
+                unsafe { mem::transmute::<&[libc::c_char], &[u8]>(&addr.sun_path) };
+            len = core::slice::memchr::memchr(0, sun_path)
+                .map_or(len, |new_len| (new_len + sun_path_offset(&addr)) as libc::socklen_t);
+        }
+
         if len == 0 {
             // When there is a datagram from unnamed unix socket
             // linux returns zero bytes of address