Skip to content

Commit 54bf112

Browse files
committed
Make SockAddr::vsock infallible
This code can never fail, but it was incorrect marked as fallible (by returning an io::Result).
1 parent 3b167f3 commit 54bf112

File tree

2 files changed

+14
-20
lines changed

2 files changed

+14
-20
lines changed

src/sys/unix.rs

+11-17
Original file line numberDiff line numberDiff line change
@@ -537,24 +537,18 @@ impl SockAddr {
537537
docsrs,
538538
doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux"))))
539539
)]
540-
pub fn vsock(cid: u32, port: u32) -> io::Result<SockAddr> {
541-
unsafe {
542-
SockAddr::try_init(|storage, len| {
543-
// Safety: `SockAddr::try_init` zeros the address, which is a
544-
// valid representation.
545-
let storage: &mut libc::sockaddr_vm = unsafe { &mut *storage.cast() };
546-
let len: &mut socklen_t = unsafe { &mut *len };
547-
548-
storage.svm_family = libc::AF_VSOCK as sa_family_t;
549-
storage.svm_cid = cid;
550-
storage.svm_port = port;
551-
552-
*len = mem::size_of::<libc::sockaddr_vm>() as socklen_t;
553-
554-
Ok(())
555-
})
540+
pub fn vsock(cid: u32, port: u32) -> SockAddr {
541+
// SAFETY: a `sockaddr_storage` of all zeros is valid, hence we can
542+
// safely assume it's initialised.
543+
let mut storage = unsafe { MaybeUninit::<sockaddr_storage>::zeroed().assume_init() };
544+
{
545+
let storage: &mut libc::sockaddr_vm =
546+
unsafe { &mut *((&mut storage as *mut sockaddr_storage).cast()) };
547+
storage.svm_family = libc::AF_VSOCK as sa_family_t;
548+
storage.svm_cid = cid;
549+
storage.svm_port = port;
556550
}
557-
.map(|(_, addr)| addr)
551+
unsafe { SockAddr::new(storage, mem::size_of::<libc::sockaddr_vm>() as socklen_t) }
558552
}
559553

560554
/// Returns this address VSOCK CID/port if it is in the `AF_VSOCK` family,

tests/socket.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ fn socket_address_unix_abstract_namespace() {
152152
#[test]
153153
#[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))]
154154
fn socket_address_vsock() {
155-
let addr = SockAddr::vsock(1, 9999).unwrap();
155+
let addr = SockAddr::vsock(1, 9999);
156156
assert!(addr.as_socket_ipv4().is_none());
157157
assert!(addr.as_socket_ipv6().is_none());
158158
assert_eq!(addr.vsock_address().unwrap(), (1, 9999));
@@ -459,14 +459,14 @@ fn unix() {
459459
#[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))]
460460
#[ignore = "using VSOCK family requires optional kernel support (works when enabled)"]
461461
fn vsock() {
462-
let addr = SockAddr::vsock(libc::VMADDR_CID_LOCAL, libc::VMADDR_PORT_ANY).unwrap();
462+
let addr = SockAddr::vsock(libc::VMADDR_CID_LOCAL, libc::VMADDR_PORT_ANY);
463463

464464
let listener = Socket::new(Domain::VSOCK, Type::STREAM, None).unwrap();
465465
listener.bind(&addr).unwrap();
466466
listener.listen(10).unwrap();
467467

468468
let (_, port) = listener.local_addr().unwrap().vsock_address().unwrap();
469-
let addr = SockAddr::vsock(libc::VMADDR_CID_LOCAL, port).unwrap();
469+
let addr = SockAddr::vsock(libc::VMADDR_CID_LOCAL, port);
470470
let mut a = Socket::new(Domain::VSOCK, Type::STREAM, None).unwrap();
471471
a.connect(&addr).unwrap();
472472
let mut b = listener.accept().unwrap().0;

0 commit comments

Comments
 (0)