Skip to content

Commit 720853a

Browse files
committed
Make SockAddr::from_raw_socket take a socklen_t instead of a usize
1 parent 16226d9 commit 720853a

File tree

4 files changed

+18
-17
lines changed

4 files changed

+18
-17
lines changed

src/ifaddrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl InterfaceAddress {
6767
libc::AF_NETLINK => mem::size_of::<libc::sockaddr_nl>(),
6868
_ => return None,
6969
};
70-
unsafe { SockAddr::from_raw_sockaddr(sa, len) }.ok()
70+
unsafe { SockAddr::from_raw_sockaddr(sa, len as libc::socklen_t) }.ok()
7171
};
7272
let address = get_sockaddr(info.ifa_addr);
7373
let netmask = get_sockaddr(info.ifa_netmask);

src/sys/socket/addr.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -820,15 +820,16 @@ impl SockAddr {
820820
/// let mut addr = mem::MaybeUninit::<sockaddr_storage>::uninit();
821821
/// let mut addrlen = mem::size_of::<sockaddr_storage>() as socklen_t;
822822
/// unsafe { get_me_an_address(addr.as_mut_ptr() as *mut sockaddr, &mut addrlen) };
823-
/// let addr: SockAddr = unsafe { SockAddr::from_raw_sockaddr(addr.as_ptr() as *const sockaddr, addrlen as usize)? };
823+
/// let addr: SockAddr = unsafe { SockAddr::from_raw_sockaddr(addr.as_ptr() as *const sockaddr, addrlen)? };
824824
/// # let _ = addr;
825825
/// # Ok(()) }
826826
/// ```
827827
///
828828
/// # Safety
829829
/// `addr` must be a valid, non-null pointer, and `len` should describe the
830830
/// number of bytes within `*addr` that are initialized and represent data.
831-
pub unsafe fn from_raw_sockaddr(addr: *const libc::sockaddr, len: usize) -> Result<SockAddr> {
831+
pub unsafe fn from_raw_sockaddr(addr: *const libc::sockaddr, len: libc::socklen_t) -> Result<SockAddr> {
832+
let len = len as usize;
832833
let af = (*addr).sa_family;
833834
if len < mem::size_of_val(&af) {
834835
return Err(Errno::ENOTCONN);
@@ -838,13 +839,13 @@ impl SockAddr {
838839
match af {
839840
AddressFamily::Inet => {
840841
use libc::sockaddr_in;
841-
assert!(len as usize >= mem::size_of::<sockaddr_in>());
842+
assert!(len >= mem::size_of::<sockaddr_in>());
842843
let sin = *(addr as *const sockaddr_in);
843844
Ok(SockAddr::Inet(InetAddr::V4(sin)))
844845
}
845846
AddressFamily::Inet6 => {
846847
use libc::sockaddr_in6;
847-
assert!(len as usize >= mem::size_of::<sockaddr_in6>());
848+
assert!(len >= mem::size_of::<sockaddr_in6>());
848849
let sin6 = *(addr as *const sockaddr_in6);
849850
Ok(SockAddr::Inet(InetAddr::V6(sin6)))
850851
}
@@ -1434,7 +1435,7 @@ mod tests {
14341435
fn test_macos_loopback_datalink_addr() {
14351436
let bytes = [20i8, 18, 1, 0, 24, 3, 0, 0, 108, 111, 48, 0, 0, 0, 0, 0];
14361437
let sa = bytes.as_ptr() as *const libc::sockaddr;
1437-
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len()).unwrap() };
1438+
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len() as _).unwrap() };
14381439
if let SockAddr::Link(link_addr) = sock_addr {
14391440
assert!(link_addr.is_empty())
14401441
} else {
@@ -1453,7 +1454,7 @@ mod tests {
14531454
let bytes = [20i8, 18, 7, 0, 6, 3, 6, 0, 101, 110, 48, 24, 101, -112, -35, 76, -80];
14541455
let ptr = bytes.as_ptr();
14551456
let sa = ptr as *const libc::sockaddr;
1456-
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len()).unwrap() };
1457+
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len() as _).unwrap() };
14571458

14581459
assert_eq!(sock_addr.family(), AddressFamily::Link);
14591460

@@ -1471,7 +1472,7 @@ mod tests {
14711472
let bytes = [25u8, 0, 0, 0, 6, 0, 6, 0, 24, 101, 144, 221, 76, 176];
14721473
let ptr = bytes.as_ptr();
14731474
let sa = ptr as *const libc::sockaddr;
1474-
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len()).unwrap() };
1475+
let sock_addr = unsafe { SockAddr::from_raw_sockaddr(sa, bytes.len() as _).unwrap() };
14751476

14761477
assert_eq!(sock_addr.family(), AddressFamily::Link);
14771478

src/sys/socket/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,7 @@ unsafe fn read_mhdr<'a, 'b>(
13921392
}.as_ref()
13931393
};
13941394

1395-
let address = SockAddr::from_raw_sockaddr(address, mhdr.msg_namelen as usize).ok();
1395+
let address = SockAddr::from_raw_sockaddr(address, mhdr.msg_namelen).ok();
13961396

13971397
RecvMsg {
13981398
bytes: r as usize,
@@ -1675,7 +1675,7 @@ pub fn recvfrom(sockfd: RawFd, buf: &mut [u8])
16751675
addr.as_mut_ptr() as *mut libc::sockaddr,
16761676
&mut len as *mut socklen_t))? as usize;
16771677

1678-
match SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len as usize) {
1678+
match SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len) {
16791679
Err(Errno::ENOTCONN) => Ok((ret, None)),
16801680
Ok(addr) => Ok((ret, Some(addr))),
16811681
Err(e) => Err(e)
@@ -1772,7 +1772,7 @@ pub fn getpeername(fd: RawFd) -> Result<SockAddr> {
17721772

17731773
Errno::result(ret)?;
17741774

1775-
SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len as usize)
1775+
SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len)
17761776
}
17771777
}
17781778

@@ -1792,7 +1792,7 @@ pub fn getsockname(fd: RawFd) -> Result<SockAddr> {
17921792

17931793
Errno::result(ret)?;
17941794

1795-
SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len as usize)
1795+
SockAddr::from_raw_sockaddr(addr.as_ptr() as _, len)
17961796
}
17971797
}
17981798

@@ -1812,7 +1812,7 @@ pub fn getsockname(fd: RawFd) -> Result<SockAddr> {
18121812
pub fn sockaddr_storage_to_addr(
18131813
addr: &sockaddr_storage,
18141814
len: usize) -> Result<SockAddr> {
1815-
unsafe { SockAddr::from_raw_sockaddr(addr as *const sockaddr_storage as *const sockaddr, len) }
1815+
unsafe { SockAddr::from_raw_sockaddr(addr as *const sockaddr_storage as *const sockaddr, len as _) }
18161816
}
18171817

18181818
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]

test/sys/test_socket.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ pub fn test_inetv4_addr_roundtrip_sockaddr_from_raw() {
5151
}
5252
};
5353

54-
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, ffi_size as usize).unwrap() };
54+
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, ffi_size).unwrap() };
5555
assert_eq!(from_storage, sockaddr);
56-
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, mem::size_of::<sockaddr_storage>()).unwrap() };
56+
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, mem::size_of::<sockaddr_storage>() as _).unwrap() };
5757
assert_eq!(from_storage, sockaddr);
5858
}
5959

@@ -100,9 +100,9 @@ pub fn test_inetv6_addr_roundtrip_sockaddr_from_raw() {
100100
}
101101
};
102102

103-
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, ffi_size as usize).unwrap() };
103+
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, ffi_size).unwrap() };
104104
assert_eq!(from_storage, sockaddr);
105-
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, mem::size_of::<sockaddr_storage>()).unwrap() };
105+
let from_storage = unsafe { SockAddr::from_raw_sockaddr(storage.as_ptr() as _, mem::size_of::<sockaddr_storage>() as _).unwrap() };
106106
assert_eq!(from_storage, sockaddr);
107107
}
108108

0 commit comments

Comments
 (0)