Skip to content

Commit 012e788

Browse files
committed
More PR feedback
1 parent 3174d85 commit 012e788

File tree

3 files changed

+12
-56
lines changed

3 files changed

+12
-56
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
4040
([#1964](https://github.com/nix-rust/nix/pull/1964))
4141
- Fix: send ETH_P_ALL in htons format
4242
([#1925](https://github.com/nix-rust/nix/pull/1925))
43+
- Fix: `recvmsg` now sets the length of the received `sockaddr_un` field
44+
correctly on Linux platforms. ([#2041](https://github.com/nix-rust/nix/pull/2041))
4345

4446
### Removed
4547

src/sys/socket/addr.rs

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -931,14 +931,17 @@ pub trait SockaddrLike: private::SockaddrLikePriv {
931931

932932
/// Set the length of this socket address
933933
///
934-
/// This method may only be called on socket addresses whose lenghts are dynamic, and it
934+
/// This method may only be called on socket addresses whose lengths are dynamic, and it
935935
/// returns an error if called on a type whose length is static.
936936
///
937937
/// # Safety
938938
///
939939
/// `new_length` must be a valid length for this type of address. Specifically, reads of that
940940
/// length from `self` must be valid.
941-
unsafe fn set_length(&mut self, new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic>;
941+
#[doc(hidden)]
942+
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
943+
Err(SocketAddressLengthNotDynamic)
944+
}
942945
}
943946

944947
/// The error returned by [`SockaddrLike::set_length`] on an address whose length is statically
@@ -984,10 +987,6 @@ impl SockaddrLike for () {
984987
fn len(&self) -> libc::socklen_t {
985988
0
986989
}
987-
988-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
989-
Err(SocketAddressLengthNotDynamic)
990-
}
991990
}
992991

993992
/// An IPv4 socket address
@@ -1057,10 +1056,6 @@ impl SockaddrLike for SockaddrIn {
10571056
}
10581057
Some(Self(ptr::read_unaligned(addr as *const _)))
10591058
}
1060-
1061-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
1062-
Err(SocketAddressLengthNotDynamic)
1063-
}
10641059
}
10651060

10661061
#[cfg(feature = "net")]
@@ -1180,10 +1175,6 @@ impl SockaddrLike for SockaddrIn6 {
11801175
}
11811176
Some(Self(ptr::read_unaligned(addr as *const _)))
11821177
}
1183-
1184-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
1185-
Err(SocketAddressLengthNotDynamic)
1186-
}
11871178
}
11881179

11891180
#[cfg(feature = "net")]
@@ -1415,19 +1406,7 @@ impl SockaddrLike for SockaddrStorage {
14151406
unsafe fn set_length(&mut self, new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
14161407
match self.as_unix_addr_mut() {
14171408
Some(addr) => {
1418-
cfg_if! {
1419-
if #[cfg(any(target_os = "android",
1420-
target_os = "fuchsia",
1421-
target_os = "illumos",
1422-
target_os = "linux",
1423-
target_os = "redox",
1424-
))] {
1425-
addr.sun_len = new_length as u8;
1426-
} else {
1427-
addr.sun.sun_len = new_length as u8;
1428-
}
1429-
}
1430-
Ok(())
1409+
addr.set_length(new_length)
14311410
},
14321411
None => Err(SocketAddressLengthNotDynamic),
14331412
}
@@ -1825,10 +1804,6 @@ pub mod netlink {
18251804
}
18261805
Some(Self(ptr::read_unaligned(addr as *const _)))
18271806
}
1828-
1829-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
1830-
Err(SocketAddressLengthNotDynamic)
1831-
}
18321807
}
18331808

18341809
impl AsRef<libc::sockaddr_nl> for NetlinkAddr {
@@ -1878,10 +1853,6 @@ pub mod alg {
18781853
}
18791854
Some(Self(ptr::read_unaligned(addr as *const _)))
18801855
}
1881-
1882-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
1883-
Err(SocketAddressLengthNotDynamic)
1884-
}
18851856
}
18861857

18871858
impl AsRef<libc::sockaddr_alg> for AlgAddr {
@@ -1981,7 +1952,7 @@ pub mod sys_control {
19811952
use std::{fmt, mem, ptr};
19821953
use std::os::unix::io::RawFd;
19831954
use crate::{Errno, Result};
1984-
use super::{private, SockaddrLike, SocketAddressLengthNotDynamic};
1955+
use super::{private, SockaddrLike};
19851956

19861957
// FIXME: Move type into `libc`
19871958
#[repr(C)]
@@ -2022,10 +1993,6 @@ pub mod sys_control {
20221993
}
20231994
Some(Self(ptr::read_unaligned(addr as *const _)))
20241995
}
2025-
2026-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
2027-
Err(SocketAddressLengthNotDynamic)
2028-
}
20291996
}
20301997

20311998
impl AsRef<libc::sockaddr_ctl> for SysControlAddr {
@@ -2090,7 +2057,7 @@ pub mod sys_control {
20902057
mod datalink {
20912058
feature! {
20922059
#![feature = "net"]
2093-
use super::{fmt, mem, private, ptr, SockaddrLike, SocketAddressLengthNotDynamic};
2060+
use super::{fmt, mem, private, ptr, SockaddrLike};
20942061

20952062
/// Hardware Address
20962063
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -2168,10 +2135,6 @@ mod datalink {
21682135
}
21692136
Some(Self(ptr::read_unaligned(addr as *const _)))
21702137
}
2171-
2172-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
2173-
Err(SocketAddressLengthNotDynamic)
2174-
}
21752138
}
21762139

21772140
impl AsRef<libc::sockaddr_ll> for LinkAddr {
@@ -2197,7 +2160,7 @@ mod datalink {
21972160
mod datalink {
21982161
feature! {
21992162
#![feature = "net"]
2200-
use super::{fmt, mem, private, ptr, SockaddrLike, SocketAddressLengthNotDynamic};
2163+
use super::{fmt, mem, private, ptr, SockaddrLike};
22012164

22022165
/// Hardware Address
22032166
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -2296,18 +2259,13 @@ mod datalink {
22962259
}
22972260
Some(Self(ptr::read_unaligned(addr as *const _)))
22982261
}
2299-
2300-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
2301-
Err(SocketAddressLengthNotDynamic)
2302-
}
23032262
}
23042263

23052264
impl AsRef<libc::sockaddr_dl> for LinkAddr {
23062265
fn as_ref(&self) -> &libc::sockaddr_dl {
23072266
&self.0
23082267
}
23092268
}
2310-
23112269
}
23122270
}
23132271

@@ -2348,10 +2306,6 @@ pub mod vsock {
23482306
}
23492307
Some(Self(ptr::read_unaligned(addr as *const _)))
23502308
}
2351-
2352-
unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> {
2353-
Err(SocketAddressLengthNotDynamic)
2354-
}
23552309
}
23562310

23572311
impl AsRef<libc::sockaddr_vm> for VsockAddr {

src/sys/socket/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2053,7 +2053,7 @@ pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'i
20532053
where S: SockaddrLike + 'a,
20542054
'inner: 'outer
20552055
{
2056-
let mut address = mem::MaybeUninit::zeroed();
2056+
let mut address = mem::MaybeUninit::uninit();
20572057

20582058
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
20592059
.map(|v| (v.as_mut_ptr(), v.capacity()))

0 commit comments

Comments
 (0)