From 787c84b51b29c0715c6d3e73aca0148b6b112440 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Fri, 31 Jan 2020 17:17:32 -0800 Subject: sys_util: recv entire UnixSeqpacket packets into Vec This change adds the `recv_*_vec` suite of methods for getting an entire packet into a `Vec` without needing to know the packet size through some other means. TEST=cargo test -p sys_util -p msg_socket BUG=None Change-Id: Ia4f931ccb91f6de6ee2103387fd95dfad3d3d38b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2034025 Commit-Queue: Zach Reizner Tested-by: Zach Reizner Tested-by: kokoro Auto-Submit: Zach Reizner Reviewed-by: Daniel Verkamp Reviewed-by: Stephen Barber --- msg_socket/src/lib.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'msg_socket') diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs index c6e3a38..5b9f9ce 100644 --- a/msg_socket/src/lib.rs +++ b/msg_socket/src/lib.rs @@ -145,33 +145,33 @@ pub trait MsgReceiver: AsRef { fn recv(&self) -> MsgResult { let msg_size = Self::M::msg_size(); let fd_size = Self::M::max_fd_count(); - let mut msg_buffer: Vec = vec![0; msg_size]; - let mut fd_buffer: Vec = vec![0; fd_size]; let sock: &UnixSeqpacket = self.as_ref(); - let (recv_msg_size, recv_fd_size) = { + let (msg_buffer, fd_buffer) = { if fd_size == 0 { - let size = sock - .recv(&mut msg_buffer) - .map_err(|e| MsgError::Recv(SysError::new(e.raw_os_error().unwrap_or(0))))?; - (size, 0) + ( + sock.recv_as_vec().map_err(|e| { + MsgError::Recv(SysError::new(e.raw_os_error().unwrap_or(0))) + })?, + vec![], + ) } else { - sock.recv_with_fds(&mut msg_buffer, &mut fd_buffer) - .map_err(MsgError::Recv)? + sock.recv_as_vec_with_fds() + .map_err(|e| MsgError::Recv(SysError::new(e.raw_os_error().unwrap_or(0))))? } }; - if msg_size != recv_msg_size { + + if msg_size != msg_buffer.len() { return Err(MsgError::BadRecvSize { expected: msg_size, - actual: recv_msg_size, + actual: msg_buffer.len(), }); } // Safe because fd buffer is read from socket. - let (v, read_fd_size) = unsafe { - Self::M::read_from_buffer(&msg_buffer[0..recv_msg_size], &fd_buffer[0..recv_fd_size])? - }; - if recv_fd_size != read_fd_size { + let (v, read_fd_size) = + unsafe { Self::M::read_from_buffer(&msg_buffer[..], &fd_buffer[..])? }; + if fd_buffer.len() != read_fd_size { return Err(MsgError::NotExpectFd); } Ok(v) -- cgit 1.4.1