diff options
author | Zach Reizner <zachr@google.com> | 2020-02-21 14:45:14 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-04-14 23:56:49 +0000 |
commit | 297ae77887021445c02861a011a6ebb9143bf6c1 (patch) | |
tree | 496d07321d43858905e9094440f551354ac45ab3 /msg_socket/src/lib.rs | |
parent | e4cbef4caf66779e5f8734c63fb591c991bf9674 (diff) | |
download | crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar.gz crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar.bz2 crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar.lz crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar.xz crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.tar.zst crosvm-297ae77887021445c02861a011a6ebb9143bf6c1.zip |
msg_socket: add specialized error for zero sized recv
Receiving no data can be considered a special case for MsgOnSocket. It doesn't necessarily indicate EOF because usually messages are sent over a datagram channel and some fixed sized messages are actually zero sized. This change handles this by adding a specific result for receiving no data when at least some was expected. This will also simplify some error handling that had to unpack the `BadRecvSize` variant. TEST=cargo test -p msg_socket BUG=None Change-Id: I16feeabc1481de93a2b189989d095434b5b417b5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2079178 Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Auto-Submit: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'msg_socket/src/lib.rs')
-rw-r--r-- | msg_socket/src/lib.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/msg_socket/src/lib.rs b/msg_socket/src/lib.rs index 5871735..c674f37 100644 --- a/msg_socket/src/lib.rs +++ b/msg_socket/src/lib.rs @@ -164,6 +164,20 @@ pub trait MsgReceiver: AsRef<UnixSeqpacket> { ) } }; + + if msg_buffer.len() == 0 && Self::M::fixed_size() != Some(0) { + return Err(MsgError::RecvZero); + } + + if let Some(fixed_size) = Self::M::fixed_size() { + if fixed_size != msg_buffer.len() { + return Err(MsgError::BadRecvSize { + expected: fixed_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, &fd_buffer)? }; if fd_buffer.len() != read_fd_size { |