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
This commit is contained in:
parent
f13f37fd7b
commit
7aaad6b7e2
@ -107,6 +107,16 @@ pub(super) fn from_parts(
|
|||||||
addr: libc::sockaddr_un,
|
addr: libc::sockaddr_un,
|
||||||
mut len: libc::socklen_t,
|
mut len: libc::socklen_t,
|
||||||
) -> io::Result<SocketAddr> {
|
) -> 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 {
|
if len == 0 {
|
||||||
// When there is a datagram from unnamed unix socket
|
// When there is a datagram from unnamed unix socket
|
||||||
// linux returns zero bytes of address
|
// linux returns zero bytes of address
|
||||||
|
Loading…
Reference in New Issue
Block a user