summary refs log tree commit diff
path: root/msg_socket
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2020-01-31 17:17:32 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-06 21:56:37 +0000
commit787c84b51b29c0715c6d3e73aca0148b6b112440 (patch)
tree182364448e8b47f70fb74131502043361daca3b8 /msg_socket
parent4441c01124a30b7037267fdc74aeee4b6eff111a (diff)
downloadcrosvm-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.rs30
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)