• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use std::fmt::{self, Display};
6 use std::fs::File;
7 use std::net::{TcpListener, TcpStream, UdpSocket};
8 use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
9 use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream};
10 use std::result;
11 
12 use data_model::*;
13 use sys_util::{Error as SysError, EventFd};
14 
15 #[derive(Debug, PartialEq)]
16 /// An error during transaction or serialization/deserialization.
17 pub enum MsgError {
18     /// Error while sending a request or response.
19     Send(SysError),
20     /// Error while receiving a request or response.
21     Recv(SysError),
22     /// The type of a received request or response is unknown.
23     InvalidType,
24     /// There was not the expected amount of data when receiving a message. The inner
25     /// value is how much data is expected and how much data was actually received.
26     BadRecvSize { expected: usize, actual: usize },
27     /// There was no associated file descriptor received for a request that expected it.
28     ExpectFd,
29     /// There was some associated file descriptor received but not used when deserialize.
30     NotExpectFd,
31     /// Trying to serialize/deserialize, but fd buffer size is too small. This typically happens
32     /// when max_fd_count() returns a value that is too small.
33     WrongFdBufferSize,
34     /// Trying to serialize/deserialize, but msg buffer size is too small. This typically happens
35     /// when msg_size() returns a value that is too small.
36     WrongMsgBufferSize,
37 }
38 
39 pub type MsgResult<T> = result::Result<T, MsgError>;
40 
41 impl Display for MsgError {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result42     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43         use self::MsgError::*;
44 
45         match self {
46             Send(e) => write!(f, "failed to send request or response: {}", e),
47             Recv(e) => write!(f, "failed to receive request or response: {}", e),
48             InvalidType => write!(f, "invalid type"),
49             BadRecvSize { expected, actual } => write!(
50                 f,
51                 "wrong amount of data received; expected {} bytes; got {} bytes",
52                 expected, actual
53             ),
54             ExpectFd => write!(f, "missing associated file descriptor for request"),
55             NotExpectFd => write!(f, "unexpected file descriptor is unused"),
56             WrongFdBufferSize => write!(f, "fd buffer size too small"),
57             WrongMsgBufferSize => write!(f, "msg buffer size too small"),
58         }
59     }
60 }
61 
62 /// A msg that could be serialized to and deserialize from array in little endian.
63 ///
64 /// For structs, we always have fixed size of bytes and fixed count of fds.
65 /// For enums, the size needed might be different for each variant.
66 ///
67 /// e.g.
68 /// ```
69 /// use std::os::unix::io::RawFd;
70 /// enum Message {
71 ///     VariantA(u8),
72 ///     VariantB(u32, RawFd),
73 ///     VariantC,
74 /// }
75 /// ```
76 ///
77 /// For variant A, we need 1 byte to store its inner value.
78 /// For variant B, we need 4 bytes and 1 RawFd to store its inner value.
79 /// For variant C, we need 0 bytes to store its inner value.
80 /// When we serialize Message to (buffer, fd_buffer), we always use fixed number of bytes in
81 /// the buffer. Unused buffer bytes will be padded with zero.
82 /// However, for fd_buffer, we could not do the same thing. Otherwise, we are essentially sending
83 /// fd 0 through the socket.
84 /// Thus, read/write functions always the return correct count of fds in this variant. There will be
85 /// no padding in fd_buffer.
86 pub trait MsgOnSocket: Sized {
87     /// Size of message in bytes.
msg_size() -> usize88     fn msg_size() -> usize;
89     /// Max possible fd count in this type.
max_fd_count() -> usize90     fn max_fd_count() -> usize {
91         0
92     }
93     /// Returns (self, fd read count).
94     /// This function is safe only when:
95     ///     0. fds contains valid fds, received from socket, serialized by Self::write_to_buffer.
96     ///     1. For enum, fds contains correct fd layout of the particular variant.
97     ///     2. write_to_buffer is implemented correctly(put valid fds into the buffer, has no padding,
98     ///        return correct count).
read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)>99     unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)>;
100     /// Serialize self to buffers.
write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize>101     fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize>;
102 }
103 
104 impl MsgOnSocket for SysError {
msg_size() -> usize105     fn msg_size() -> usize {
106         u32::msg_size()
107     }
read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)>108     unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
109         let (v, size) = u32::read_from_buffer(buffer, fds)?;
110         Ok((SysError::new(v as i32), size))
111     }
write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize>112     fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
113         let v = self.errno() as u32;
114         v.write_to_buffer(buffer, fds)
115     }
116 }
117 
118 impl MsgOnSocket for RawFd {
msg_size() -> usize119     fn msg_size() -> usize {
120         0
121     }
max_fd_count() -> usize122     fn max_fd_count() -> usize {
123         1
124     }
read_from_buffer(_buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)>125     unsafe fn read_from_buffer(_buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
126         if fds.is_empty() {
127             return Err(MsgError::ExpectFd);
128         }
129         Ok((fds[0], 1))
130     }
write_to_buffer(&self, _buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize>131     fn write_to_buffer(&self, _buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
132         if fds.is_empty() {
133             return Err(MsgError::WrongFdBufferSize);
134         }
135         fds[0] = *self;
136         Ok(1)
137     }
138 }
139 
140 impl<T: MsgOnSocket> MsgOnSocket for Option<T> {
msg_size() -> usize141     fn msg_size() -> usize {
142         T::msg_size() + 1
143     }
144 
max_fd_count() -> usize145     fn max_fd_count() -> usize {
146         T::max_fd_count()
147     }
148 
read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)>149     unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
150         match buffer[0] {
151             0 => Ok((None, 0)),
152             1 => {
153                 let (inner, len) = T::read_from_buffer(&buffer[1..], fds)?;
154                 Ok((Some(inner), len))
155             }
156             _ => Err(MsgError::InvalidType),
157         }
158     }
159 
write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize>160     fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
161         match self {
162             None => {
163                 buffer[0] = 0;
164                 Ok(0)
165             }
166             Some(inner) => {
167                 buffer[0] = 1;
168                 inner.write_to_buffer(&mut buffer[1..], fds)
169             }
170         }
171     }
172 }
173 
174 impl MsgOnSocket for () {
msg_size() -> usize175     fn msg_size() -> usize {
176         0
177     }
178 
max_fd_count() -> usize179     fn max_fd_count() -> usize {
180         0
181     }
182 
read_from_buffer(_buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)>183     unsafe fn read_from_buffer(_buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> {
184         Ok(((), 0))
185     }
186 
write_to_buffer(&self, _buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize>187     fn write_to_buffer(&self, _buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize> {
188         Ok(0)
189     }
190 }
191 
192 macro_rules! rawfd_impl {
193     ($type:ident) => {
194         impl MsgOnSocket for $type {
195             fn msg_size() -> usize {
196                 0
197             }
198             fn max_fd_count() -> usize {
199                 1
200             }
201             unsafe fn read_from_buffer(_buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
202                 if fds.len() < 1 {
203                     return Err(MsgError::ExpectFd);
204                 }
205                 Ok(($type::from_raw_fd(fds[0].clone()), 1))
206             }
207             fn write_to_buffer(&self, _buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
208                 if fds.len() < 1 {
209                     return Err(MsgError::WrongFdBufferSize);
210                 }
211                 fds[0] = self.as_raw_fd();
212                 Ok(1)
213             }
214         }
215     };
216 }
217 
218 rawfd_impl!(EventFd);
219 rawfd_impl!(File);
220 rawfd_impl!(UnixStream);
221 rawfd_impl!(TcpStream);
222 rawfd_impl!(TcpListener);
223 rawfd_impl!(UdpSocket);
224 rawfd_impl!(UnixListener);
225 rawfd_impl!(UnixDatagram);
226 
227 // Converts a slice into an array of fixed size inferred from by the return value. Panics if the
228 // slice is too small, but will tolerate slices that are too large.
slice_to_array<T, O>(s: &[T]) -> O where T: Copy, O: Default + AsMut<[T]>,229 fn slice_to_array<T, O>(s: &[T]) -> O
230 where
231     T: Copy,
232     O: Default + AsMut<[T]>,
233 {
234     let mut o = O::default();
235     let o_slice = o.as_mut();
236     let len = o_slice.len();
237     o_slice.copy_from_slice(&s[..len]);
238     o
239 }
240 
241 // usize could be different sizes on different targets. We always use u64.
242 impl MsgOnSocket for usize {
msg_size() -> usize243     fn msg_size() -> usize {
244         std::mem::size_of::<u64>()
245     }
read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)>246     unsafe fn read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> {
247         if buffer.len() < std::mem::size_of::<u64>() {
248             return Err(MsgError::WrongMsgBufferSize);
249         }
250         let t = u64::from_le_bytes(slice_to_array(buffer));
251         Ok((t as usize, 0))
252     }
253 
write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize>254     fn write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize> {
255         if buffer.len() < std::mem::size_of::<u64>() {
256             return Err(MsgError::WrongMsgBufferSize);
257         }
258         let t: Le64 = (*self as u64).into();
259         buffer[0..Self::msg_size()].copy_from_slice(t.as_slice());
260         Ok(0)
261     }
262 }
263 
264 // Encode bool as a u8 of value 0 or 1
265 impl MsgOnSocket for bool {
msg_size() -> usize266     fn msg_size() -> usize {
267         std::mem::size_of::<u8>()
268     }
read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)>269     unsafe fn read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> {
270         if buffer.len() < std::mem::size_of::<u8>() {
271             return Err(MsgError::WrongMsgBufferSize);
272         }
273         let t: u8 = buffer[0];
274         match t {
275             0 => Ok((false, 0)),
276             1 => Ok((true, 0)),
277             _ => Err(MsgError::InvalidType),
278         }
279     }
write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize>280     fn write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize> {
281         if buffer.len() < std::mem::size_of::<u8>() {
282             return Err(MsgError::WrongMsgBufferSize);
283         }
284         buffer[0] = *self as u8;
285         Ok(0)
286     }
287 }
288 
289 macro_rules! le_impl {
290     ($type:ident, $native_type:ident) => {
291         impl MsgOnSocket for $type {
292             fn msg_size() -> usize {
293                 std::mem::size_of::<$native_type>()
294             }
295             unsafe fn read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> {
296                 if buffer.len() < std::mem::size_of::<$native_type>() {
297                     return Err(MsgError::WrongMsgBufferSize);
298                 }
299                 let t = $native_type::from_le_bytes(slice_to_array(buffer));
300                 Ok((t.into(), 0))
301             }
302 
303             fn write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize> {
304                 if buffer.len() < std::mem::size_of::<$native_type>() {
305                     return Err(MsgError::WrongMsgBufferSize);
306                 }
307                 let t: $native_type = self.clone().into();
308                 buffer[0..Self::msg_size()].copy_from_slice(&t.to_le_bytes());
309                 Ok(0)
310             }
311         }
312     };
313 }
314 
315 le_impl!(u8, u8);
316 le_impl!(u16, u16);
317 le_impl!(u32, u32);
318 le_impl!(u64, u64);
319 
320 le_impl!(Le16, u16);
321 le_impl!(Le32, u32);
322 le_impl!(Le64, u64);
323 
324 macro_rules! array_impls {
325     ($N:expr, $t: ident $($ts:ident)*)
326     => {
327         impl<T: MsgOnSocket + Clone> MsgOnSocket for [T; $N] {
328             fn msg_size() -> usize {
329                 T::msg_size() * $N
330             }
331             fn max_fd_count() -> usize {
332                 T::max_fd_count() * $N
333             }
334             unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
335                 if buffer.len() < Self::msg_size() {
336                     return Err(MsgError::WrongMsgBufferSize);
337                 }
338                 let mut offset = 0usize;
339                 let mut fd_offset = 0usize;
340                 let ($t, fd_size) =
341                     T::read_from_buffer(&buffer[offset..], &fds[fd_offset..])?;
342                 offset += T::msg_size();
343                 fd_offset += fd_size;
344                 $(
345                     let ($ts, fd_size) =
346                         T::read_from_buffer(&buffer[offset..], &fds[fd_offset..])?;
347                     offset += T::msg_size();
348                     fd_offset += fd_size;
349                     )*
350                 assert_eq!(offset, Self::msg_size());
351                 Ok(([$t, $($ts),*], fd_offset))
352             }
353 
354             fn write_to_buffer(
355                 &self,
356                 buffer: &mut [u8],
357                 fds: &mut [RawFd],
358                 ) -> MsgResult<usize> {
359                 if buffer.len() < Self::msg_size() {
360                     return Err(MsgError::WrongMsgBufferSize);
361                 }
362                 let mut offset = 0usize;
363                 let mut fd_offset = 0usize;
364                 for idx in 0..$N {
365                     let fd_size = self[idx].clone().write_to_buffer(&mut buffer[offset..],
366                                                             &mut fds[fd_offset..])?;
367                     offset += T::msg_size();
368                     fd_offset += fd_size;
369                 }
370 
371                 Ok(fd_offset)
372             }
373         }
374         array_impls!(($N - 1), $($ts)*);
375     };
376     {$N:expr, } => {};
377 }
378 
379 array_impls! {
380     32, tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 tmp7 tmp8 tmp9 tmp10 tmp11 tmp12 tmp13 tmp14 tmp15 tmp16
381         tmp17 tmp18 tmp19 tmp20 tmp21 tmp22 tmp23 tmp24 tmp25 tmp26 tmp27 tmp28 tmp29 tmp30 tmp31
382         tmp32
383 }
384 
385 // TODO(jkwang) Define MsgOnSocket for tuple?
386