-
Notifications
You must be signed in to change notification settings - Fork 166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
net/linux_kernel: add unnamed Unix-domain addresses #1242
base: main
Are you sure you want to change the base?
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
src/backend/libc/net/addr.rs
Outdated
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you comment on why you changed this to use saturating_sub
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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, |
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 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()
.