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