net/linux_kernel: add unnamed Unix-domain addresses#1242
net/linux_kernel: add unnamed Unix-domain addresses#1242sunfishcode merged 2 commits intobytecodealliance:mainfrom
Conversation
I think it would be useful to have unnamed Unix-domain addressed in
rustix. This PR adds the methods `SocketAddrUnix::new_unnamed()` and
`SocketAddrUnix::is_unnamed()`.
In C it is possible to have an [unnamed Unix-domain] socket name, when
you set `len` = 2 = `sizeof(c::socklen_t)`. Then the kernel will choose
an abstract Unix-domain name for you when you bind the socket. The same
feature present also in Python, when you call [`sock.bind("")`].
Invoking [`SocketAddrUnix::new_abstract_name(b"")`] gives you an empty
abstract socket address, i.e. `SocketAddrUnix::len == 3`. The kernel
will keep this empty abstract name on calling `bind()`.
[unnamed Unix-domain]: https://manpages.debian.org/bookworm/manpages/unix.7.en.html#unnamed
[`sock.bind("")`]: https://docs.python.org/3.13/library/socket.html#socket.socket.bind
[`SocketAddrUnix::new_abstract_name(b"")`]: https://docs.rs/rustix/0.38.42/rustix/net/struct.SocketAddrUnix.html#method.new_abstract_name
| let len = self.len(); | ||
| if len != 0 && self.unix.sun_path[0] == 0 { | ||
| let end = len as usize - offsetof_sun_path(); | ||
| let end = self.len().saturating_sub(offsetof_sun_path()); |
There was a problem hiding this comment.
Can you comment on why you changed this to use saturating_sub?
There was a problem hiding this comment.
I wanted to remove one indentation level by removing the test if len == 0, followed by len > offsetof_sun_path. I don't know if there actually is a case where len == 0. If there isn't, then a normal subtraction would be good enough. Alternatively, because the method returns an Option, checked_sub would work, too.
There was a problem hiding this comment.
Or was your question why I changed the method at all? The current implementation cannot tell unnamed socket addresses and abstract addresses apart and will panic on an unnamed address.
|
I refactored all three methods, |
|
Thanks! |
I think it would be useful to have unnamed Unix-domain addressed in rustix. This PR adds the methods
SocketAddrUnix::new_unnamed()andSocketAddrUnix::is_unnamed().In C it is possible to have an unnamed Unix-domain socket name, when you set
len= 2 =sizeof(c::socklen_t). Then the kernel will choose an abstract Unix-domain name for you when you bind the socket. The same feature present is also in Python, when you callsock.bind("").Invoking
SocketAddrUnix::new_abstract_name(b"")gives you an empty abstract socket address, i.e.SocketAddrUnix::len == 3. The kernel will keep this empty abstract name on callingbind().