Skip to content

Commit 56806e8

Browse files
committed
Use MsgHdr in send(_to)_vectored
1 parent 51377a0 commit 56806e8

File tree

2 files changed

+8
-30
lines changed

2 files changed

+8
-30
lines changed

src/sockaddr.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,6 @@ impl SockAddr {
205205
self.storage.ss_family == AF_UNIX as sa_family_t
206206
}
207207

208-
/// Returns a raw pointer to the address storage.
209-
#[cfg(all(unix, not(target_os = "redox")))]
210-
pub(crate) const fn as_storage_ptr(&self) -> *const sockaddr_storage {
211-
&self.storage
212-
}
213-
214208
/// Returns this address as a `SocketAddr` if it is in the `AF_INET` (IPv4)
215209
/// or `AF_INET6` (IPv6) family, otherwise returns `None`.
216210
pub fn as_socket(&self) -> Option<SocketAddr> {

src/sys/unix.rs

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ use std::{io, slice};
7070
use libc::ssize_t;
7171
use libc::{in6_addr, in_addr};
7272

73-
#[cfg(not(target_os = "redox"))]
74-
use crate::RecvFlags;
7573
use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type};
74+
#[cfg(not(target_os = "redox"))]
75+
use crate::{MsgHdr, RecvFlags};
7676

7777
pub(crate) use libc::c_int;
7878

@@ -1036,7 +1036,8 @@ pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result<usize> {
10361036

10371037
#[cfg(not(target_os = "redox"))]
10381038
pub(crate) fn send_vectored(fd: Socket, bufs: &[IoSlice<'_>], flags: c_int) -> io::Result<usize> {
1039-
sendmsg(fd, ptr::null(), 0, bufs, flags)
1039+
let msg = MsgHdr::new().with_buffers(bufs);
1040+
sendmsg(fd, &msg, flags)
10401041
}
10411042

10421043
pub(crate) fn send_to(fd: Socket, buf: &[u8], addr: &SockAddr, flags: c_int) -> io::Result<usize> {
@@ -1058,30 +1059,13 @@ pub(crate) fn send_to_vectored(
10581059
addr: &SockAddr,
10591060
flags: c_int,
10601061
) -> io::Result<usize> {
1061-
sendmsg(fd, addr.as_storage_ptr(), addr.len(), bufs, flags)
1062+
let msg = MsgHdr::new().with_addr(addr).with_buffers(bufs);
1063+
sendmsg(fd, &msg, flags)
10621064
}
10631065

1064-
/// Returns the (bytes received, sending address len, `RecvFlags`).
10651066
#[cfg(not(target_os = "redox"))]
1066-
#[allow(clippy::unnecessary_cast)] // For `IovLen::MAX as usize` (Already `usize` on Linux).
1067-
fn sendmsg(
1068-
fd: Socket,
1069-
msg_name: *const sockaddr_storage,
1070-
msg_namelen: socklen_t,
1071-
bufs: &[IoSlice<'_>],
1072-
flags: c_int,
1073-
) -> io::Result<usize> {
1074-
// libc::msghdr contains unexported padding fields on Fuchsia.
1075-
let mut msg: libc::msghdr = unsafe { mem::zeroed() };
1076-
// Safety: we're creating a `*mut` pointer from a reference, which is UB
1077-
// once actually used. However the OS should not write to it in the
1078-
// `sendmsg` system call.
1079-
msg.msg_name = (msg_name as *mut sockaddr_storage).cast();
1080-
msg.msg_namelen = msg_namelen;
1081-
// Safety: Same as above about `*const` -> `*mut`.
1082-
msg.msg_iov = bufs.as_ptr() as *mut _;
1083-
msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen;
1084-
syscall!(sendmsg(fd, &msg, flags)).map(|n| n as usize)
1067+
fn sendmsg(fd: Socket, msg: &MsgHdr<'_, '_, '_>, flags: c_int) -> io::Result<usize> {
1068+
syscall!(sendmsg(fd, &msg.inner, flags)).map(|n| n as usize)
10851069
}
10861070

10871071
/// Wrapper around `getsockopt` to deal with platform specific timeouts.

0 commit comments

Comments
 (0)