diff options
| author | Sebastien Marie <semarie@kapouay.eu.org> | 2024-04-11 08:43:38 +0000 |
|---|---|---|
| committer | Sebastien Marie <semarie@kapouay.eu.org> | 2024-04-11 08:43:38 +0000 |
| commit | 7aaad6b7e2c04f97c1f9472dfeecea9662a35bb4 (patch) | |
| tree | bd91ac2c1e830864e2732eeca85202e8c2c899a5 /library/std/src/os/unix | |
| parent | f13f37fd7bbbc34c663311739176fe114ef51085 (diff) | |
| download | rust-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')
| -rw-r--r-- | library/std/src/os/unix/net/addr.rs | 10 |
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 |
