diff options
author | Zach Reizner <zachr@google.com> | 2020-01-31 17:17:32 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-06 21:56:37 +0000 |
commit | 787c84b51b29c0715c6d3e73aca0148b6b112440 (patch) | |
tree | 182364448e8b47f70fb74131502043361daca3b8 /msg_socket | |
parent | 4441c01124a30b7037267fdc74aeee4b6eff111a (diff) | |
download | crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar.gz crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar.bz2 crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar.lz crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar.xz crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.tar.zst crosvm-787c84b51b29c0715c6d3e73aca0148b6b112440.zip |
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 <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Auto-Submit: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'msg_socket')
-rw-r--r-- | msg_socket/src/lib.rs | 30 |
1 files changed, 15 insertions, 15 deletions
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<UnixSeqpacket> { fn recv(&self) -> MsgResult<Self::M> { let msg_size = Self::M::msg_size(); let fd_size = Self::M::max_fd_count(); - let mut msg_buffer: Vec<u8> = vec![0; msg_size]; - let mut fd_buffer: Vec<RawFd> = 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) |