1 /*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 use crate::binder::{AsNative, FromIBinder, Interface, Stability, Strong};
18 use crate::error::{status_result, status_t, Result, Status, StatusCode};
19 use crate::parcel::BorrowedParcel;
20 use crate::proxy::SpIBinder;
21 use crate::sys;
22
23 use std::convert::{TryFrom, TryInto};
24 use std::ffi::c_void;
25 use std::mem::{self, ManuallyDrop};
26 use std::os::raw::c_char;
27 use std::ptr;
28 use std::slice;
29
30 /// Super-trait for structured Binder parcelables, i.e. those generated from AIDL.
31 ///
32 /// This trait is equivalent `android::Parcelable` in C++,
33 /// and defines a common interface that all parcelables need
34 /// to implement.
35 pub trait Parcelable {
36 /// Internal serialization function for parcelables.
37 ///
38 /// This method is mainly for internal use.
39 /// `Serialize::serialize` and its variants are generally
40 /// preferred over this function, since the former also
41 /// prepend a header.
write_to_parcel(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>42 fn write_to_parcel(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>;
43
44 /// Internal deserialization function for parcelables.
45 ///
46 /// This method is mainly for internal use.
47 /// `Deserialize::deserialize` and its variants are generally
48 /// preferred over this function, since the former also
49 /// parse the additional header.
read_from_parcel(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()>50 fn read_from_parcel(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()>;
51 }
52
53 /// Super-trait for unstructured Binder parcelables, i.e. those implemented manually.
54 ///
55 /// These differ from structured parcelables in that they may not have a reasonable default value
56 /// and so aren't required to implement `Default`.
57 pub trait UnstructuredParcelable: Sized {
58 /// Internal serialization function for parcelables.
59 ///
60 /// This method is mainly for internal use. `Serialize::serialize` and its variants are
61 /// generally preferred over calling this function, since the former also prepend a header.
write_to_parcel(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>62 fn write_to_parcel(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>;
63
64 /// Internal deserialization function for parcelables.
65 ///
66 /// This method is mainly for internal use. `Deserialize::deserialize` and its variants are
67 /// generally preferred over calling this function, since the former also parse the additional
68 /// header.
from_parcel(parcel: &BorrowedParcel<'_>) -> Result<Self>69 fn from_parcel(parcel: &BorrowedParcel<'_>) -> Result<Self>;
70
71 /// Internal deserialization function for parcelables.
72 ///
73 /// This method is mainly for internal use. `Deserialize::deserialize_from` and its variants are
74 /// generally preferred over calling this function, since the former also parse the additional
75 /// header.
read_from_parcel(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()>76 fn read_from_parcel(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()> {
77 *self = Self::from_parcel(parcel)?;
78 Ok(())
79 }
80 }
81
82 /// A struct whose instances can be written to a [`crate::parcel::Parcel`].
83 // Might be able to hook this up as a serde backend in the future?
84 pub trait Serialize {
85 /// Serialize this instance into the given [`crate::parcel::Parcel`].
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>86 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>;
87 }
88
89 /// A struct whose instances can be restored from a [`crate::parcel::Parcel`].
90 // Might be able to hook this up as a serde backend in the future?
91 pub trait Deserialize: Sized {
92 /// Type for the uninitialized value of this type. Will be either `Self`
93 /// if the type implements `Default`, `Option<Self>` otherwise.
94 type UninitType;
95
96 /// Assert at compile-time that `Self` and `Self::UninitType` have the same
97 /// size and alignment. This will either fail to compile or evaluate to `true`.
98 /// The only two macros that work here are `panic!` and `assert!`, so we cannot
99 /// use `assert_eq!`.
100 const ASSERT_UNINIT_SIZE_AND_ALIGNMENT: bool = {
101 assert!(std::mem::size_of::<Self>() == std::mem::size_of::<Self::UninitType>());
102 assert!(std::mem::align_of::<Self>() == std::mem::align_of::<Self::UninitType>());
103 true
104 };
105
106 /// Return an uninitialized or default-initialized value for this type.
uninit() -> Self::UninitType107 fn uninit() -> Self::UninitType;
108
109 /// Convert an initialized value of type `Self` into `Self::UninitType`.
from_init(value: Self) -> Self::UninitType110 fn from_init(value: Self) -> Self::UninitType;
111
112 /// Deserialize an instance from the given [`crate::parcel::Parcel`].
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>113 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>;
114
115 /// Deserialize an instance from the given [`crate::parcel::Parcel`] onto the
116 /// current object. This operation will overwrite the old value
117 /// partially or completely, depending on how much data is available.
deserialize_from(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()>118 fn deserialize_from(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()> {
119 *self = Self::deserialize(parcel)?;
120 Ok(())
121 }
122 }
123
124 /// Helper trait for types that can be serialized as arrays.
125 /// Defaults to calling Serialize::serialize() manually for every element,
126 /// but can be overridden for custom implementations like `writeByteArray`.
127 // Until specialization is stabilized in Rust, we need this to be a separate
128 // trait because it's the only way to have a default implementation for a method.
129 // We want the default implementation for most types, but an override for
130 // a few special ones like `readByteArray` for `u8`.
131 pub trait SerializeArray: Serialize + Sized {
132 /// Serialize an array of this type into the given parcel.
serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()>133 fn serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()> {
134 // Safety: Safe FFI, slice will always be a safe pointer to pass.
135 let res = unsafe {
136 sys::AParcel_writeParcelableArray(
137 parcel.as_native_mut(),
138 slice.as_ptr() as *const c_void,
139 slice.len().try_into().or(Err(StatusCode::BAD_VALUE))?,
140 Some(serialize_element::<Self>),
141 )
142 };
143 status_result(res)
144 }
145 }
146
147 /// Callback to serialize an element of a generic parcelable array.
148 ///
149 /// # Safety
150 ///
151 /// We are relying on binder_ndk to not overrun our slice. As long as it
152 /// doesn't provide an index larger than the length of the original slice in
153 /// serialize_array, this operation is safe. The index provided is zero-based.
serialize_element<T: Serialize>( parcel: *mut sys::AParcel, array: *const c_void, index: usize, ) -> status_t154 unsafe extern "C" fn serialize_element<T: Serialize>(
155 parcel: *mut sys::AParcel,
156 array: *const c_void,
157 index: usize,
158 ) -> status_t {
159 // Safety: The caller guarantees that `array` is a valid pointer of the
160 // appropriate type.
161 let slice: &[T] = unsafe { slice::from_raw_parts(array.cast(), index + 1) };
162
163 // Safety: The caller must give us a parcel pointer which is either null or
164 // valid at least for the duration of this function call. We don't keep the
165 // resulting value beyond the function.
166 let mut parcel = match unsafe { BorrowedParcel::from_raw(parcel) } {
167 None => return StatusCode::UNEXPECTED_NULL as status_t,
168 Some(p) => p,
169 };
170
171 slice[index].serialize(&mut parcel).err().unwrap_or(StatusCode::OK) as status_t
172 }
173
174 /// Helper trait for types that can be deserialized as arrays.
175 /// Defaults to calling Deserialize::deserialize() manually for every element,
176 /// but can be overridden for custom implementations like `readByteArray`.
177 pub trait DeserializeArray: Deserialize {
178 /// Deserialize an array of type from the given parcel.
deserialize_array(parcel: &BorrowedParcel<'_>) -> Result<Option<Vec<Self>>>179 fn deserialize_array(parcel: &BorrowedParcel<'_>) -> Result<Option<Vec<Self>>> {
180 let mut vec: Option<Vec<Self::UninitType>> = None;
181 // Safety: Safe FFI, vec is the correct opaque type expected by
182 // allocate_vec and deserialize_element.
183 let res = unsafe {
184 sys::AParcel_readParcelableArray(
185 parcel.as_native(),
186 &mut vec as *mut _ as *mut c_void,
187 Some(allocate_vec::<Self>),
188 Some(deserialize_element::<Self>),
189 )
190 };
191 status_result(res)?;
192 // Safety: We are assuming that the NDK correctly initialized every
193 // element of the vector by now, so we know that all the
194 // UninitTypes are now properly initialized. We can transmute from
195 // Vec<T::UninitType> to Vec<T> because T::UninitType has the same
196 // alignment and size as T, so the pointer to the vector allocation
197 // will be compatible.
198 let vec: Option<Vec<Self>> = unsafe { mem::transmute(vec) };
199 Ok(vec)
200 }
201 }
202
203 /// Callback to deserialize a parcelable element.
204 ///
205 /// # Safety
206 ///
207 /// The opaque array data pointer must be a mutable pointer to an
208 /// `Option<Vec<T::UninitType>>` with at least enough elements for `index` to be valid
209 /// (zero-based).
deserialize_element<T: Deserialize>( parcel: *const sys::AParcel, array: *mut c_void, index: usize, ) -> status_t210 unsafe extern "C" fn deserialize_element<T: Deserialize>(
211 parcel: *const sys::AParcel,
212 array: *mut c_void,
213 index: usize,
214 ) -> status_t {
215 // Safety: The caller guarantees that `array` is a valid pointer of the
216 // appropriate type.
217 let vec = unsafe { &mut *(array as *mut Option<Vec<T::UninitType>>) };
218 let vec = match vec {
219 Some(v) => v,
220 None => return StatusCode::BAD_INDEX as status_t,
221 };
222
223 // Safety: The caller must give us a parcel pointer which is either null or
224 // valid at least for the duration of this function call. We don't keep the
225 // resulting value beyond the function.
226 let parcel = match unsafe { BorrowedParcel::from_raw(parcel as *mut _) } {
227 None => return StatusCode::UNEXPECTED_NULL as status_t,
228 Some(p) => p,
229 };
230 let element = match parcel.read() {
231 Ok(e) => e,
232 Err(code) => return code as status_t,
233 };
234 vec[index] = T::from_init(element);
235 StatusCode::OK as status_t
236 }
237
238 /// Flag that specifies that the following parcelable is present.
239 ///
240 /// This is the Rust equivalent of `Parcel::kNonNullParcelableFlag`
241 /// from `include/binder/Parcel.h` in C++.
242 pub const NON_NULL_PARCELABLE_FLAG: i32 = 1;
243
244 /// Flag that specifies that the following parcelable is absent.
245 ///
246 /// This is the Rust equivalent of `Parcel::kNullParcelableFlag`
247 /// from `include/binder/Parcel.h` in C++.
248 pub const NULL_PARCELABLE_FLAG: i32 = 0;
249
250 /// Helper trait for types that can be nullable when serialized.
251 // We really need this trait instead of implementing `Serialize for Option<T>`
252 // because of the Rust orphan rule which prevents us from doing
253 // `impl Serialize for Option<&dyn IFoo>` for AIDL interfaces.
254 // Instead we emit `impl SerializeOption for dyn IFoo` which is allowed.
255 // We also use it to provide a default implementation for AIDL-generated
256 // parcelables.
257 pub trait SerializeOption: Serialize {
258 /// Serialize an Option of this type into the given parcel.
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>259 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
260 if let Some(inner) = this {
261 parcel.write(&NON_NULL_PARCELABLE_FLAG)?;
262 parcel.write(inner)
263 } else {
264 parcel.write(&NULL_PARCELABLE_FLAG)
265 }
266 }
267 }
268
269 /// Helper trait for types that can be nullable when deserialized.
270 pub trait DeserializeOption: Deserialize {
271 /// Deserialize an Option of this type from the given parcel.
deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>>272 fn deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>> {
273 let null: i32 = parcel.read()?;
274 if null == NULL_PARCELABLE_FLAG {
275 Ok(None)
276 } else {
277 parcel.read().map(Some)
278 }
279 }
280
281 /// Deserialize an Option of this type from the given parcel onto the
282 /// current object. This operation will overwrite the current value
283 /// partially or completely, depending on how much data is available.
deserialize_option_from(this: &mut Option<Self>, parcel: &BorrowedParcel<'_>) -> Result<()>284 fn deserialize_option_from(this: &mut Option<Self>, parcel: &BorrowedParcel<'_>) -> Result<()> {
285 *this = Self::deserialize_option(parcel)?;
286 Ok(())
287 }
288 }
289
290 /// Callback to allocate a vector for parcel array read functions.
291 ///
292 /// This variant is for APIs which use an out buffer pointer.
293 ///
294 /// # Safety
295 ///
296 /// The opaque data pointer passed to the array read function must be a mutable
297 /// pointer to an `Option<Vec<T::UninitType>>`. `buffer` will be assigned a mutable pointer
298 /// to the allocated vector data if this function returns true. `buffer` must be a valid pointer.
allocate_vec_with_buffer<T: Deserialize>( data: *mut c_void, len: i32, buffer: *mut *mut T, ) -> bool299 unsafe extern "C" fn allocate_vec_with_buffer<T: Deserialize>(
300 data: *mut c_void,
301 len: i32,
302 buffer: *mut *mut T,
303 ) -> bool {
304 // Safety: We have the same safety requirements as `allocate_vec` for `data`.
305 let res = unsafe { allocate_vec::<T>(data, len) };
306 // Safety: The caller guarantees that `data` is a valid mutable pointer to the appropriate type.
307 let vec = unsafe { &mut *(data as *mut Option<Vec<T::UninitType>>) };
308 if let Some(new_vec) = vec {
309 // Safety: The caller guarantees that `buffer` is a valid pointer.
310 unsafe {
311 *buffer = new_vec.as_mut_ptr() as *mut T;
312 }
313 }
314 res
315 }
316
317 /// Callback to allocate a vector for parcel array read functions.
318 ///
319 /// # Safety
320 ///
321 /// The opaque data pointer passed to the array read function must be a mutable
322 /// pointer to an `Option<Vec<T::UninitType>>`.
allocate_vec<T: Deserialize>(data: *mut c_void, len: i32) -> bool323 unsafe extern "C" fn allocate_vec<T: Deserialize>(data: *mut c_void, len: i32) -> bool {
324 // Safety: The caller guarantees that `data` is a valid mutable pointer to the appropriate type.
325 let vec = unsafe { &mut *(data as *mut Option<Vec<T::UninitType>>) };
326 if len < 0 {
327 *vec = None;
328 return true;
329 }
330
331 // Assert at compile time that `T` and `T::UninitType` have the same size and alignment.
332 let _ = T::ASSERT_UNINIT_SIZE_AND_ALIGNMENT;
333 let mut new_vec: Vec<T::UninitType> = Vec::with_capacity(len as usize);
334 new_vec.resize_with(len as usize, T::uninit);
335
336 // Safety: The caller guarantees that vec is a valid mutable pointer to the appropriate type.
337 unsafe {
338 ptr::write(vec, Some(new_vec));
339 }
340 true
341 }
342
343 macro_rules! parcelable_primitives {
344 {
345 $(
346 impl $trait:ident for $ty:ty = $fn:path;
347 )*
348 } => {
349 $(impl_parcelable!{$trait, $ty, $fn})*
350 };
351 }
352
353 /// Safety: All elements in the vector must be properly initialized.
vec_assume_init<T: Deserialize>(vec: Vec<T::UninitType>) -> Vec<T>354 unsafe fn vec_assume_init<T: Deserialize>(vec: Vec<T::UninitType>) -> Vec<T> {
355 // Assert at compile time that `T` and `T::UninitType` have the same size and alignment.
356 let _ = T::ASSERT_UNINIT_SIZE_AND_ALIGNMENT;
357
358 let mut vec = ManuallyDrop::new(vec);
359 // Safety: We can convert from Vec<T::UninitType> to Vec<T> because
360 // T::UninitType has the same alignment and size as T, so the pointer to the
361 // vector allocation will be compatible.
362 unsafe { Vec::from_raw_parts(vec.as_mut_ptr().cast(), vec.len(), vec.capacity()) }
363 }
364
365 macro_rules! impl_parcelable {
366 {Serialize, $ty:ty, $write_fn:path} => {
367 impl Serialize for $ty {
368 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
369 // Safety: `Parcel` always contains a valid pointer to an
370 // `AParcel`, and any `$ty` literal value is safe to pass to
371 // `$write_fn`.
372 unsafe {
373 status_result($write_fn(parcel.as_native_mut(), *self))
374 }
375 }
376 }
377 };
378
379 {Deserialize, $ty:ty, $read_fn:path} => {
380 impl Deserialize for $ty {
381 type UninitType = Self;
382 fn uninit() -> Self::UninitType { Self::UninitType::default() }
383 fn from_init(value: Self) -> Self::UninitType { value }
384 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
385 let mut val = Self::default();
386 // Safety: `Parcel` always contains a valid pointer to an
387 // `AParcel`. We pass a valid, mutable pointer to `val`, a
388 // literal of type `$ty`, and `$read_fn` will write the
389 // value read into `val` if successful
390 unsafe {
391 status_result($read_fn(parcel.as_native(), &mut val))?
392 };
393 Ok(val)
394 }
395 }
396 };
397
398 {SerializeArray, $ty:ty, $write_array_fn:path} => {
399 impl SerializeArray for $ty {
400 fn serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()> {
401 // Safety: `Parcel` always contains a valid pointer to an
402 // `AParcel`. If the slice is > 0 length, `slice.as_ptr()`
403 // will be a valid pointer to an array of elements of type
404 // `$ty`. If the slice length is 0, `slice.as_ptr()` may be
405 // dangling, but this is safe since the pointer is not
406 // dereferenced if the length parameter is 0.
407 let status = unsafe {
408 $write_array_fn(
409 parcel.as_native_mut(),
410 slice.as_ptr(),
411 slice
412 .len()
413 .try_into()
414 .or(Err(StatusCode::BAD_VALUE))?,
415 )
416 };
417 status_result(status)
418 }
419 }
420 };
421
422 {DeserializeArray, $ty:ty, $read_array_fn:path} => {
423 impl DeserializeArray for $ty {
424 fn deserialize_array(parcel: &BorrowedParcel<'_>) -> Result<Option<Vec<Self>>> {
425 let mut vec: Option<Vec<Self::UninitType>> = None;
426 // Safety: `Parcel` always contains a valid pointer to an
427 // `AParcel`. `allocate_vec<T>` expects the opaque pointer to
428 // be of type `*mut Option<Vec<T::UninitType>>`, so `&mut vec` is
429 // correct for it.
430 let status = unsafe {
431 $read_array_fn(
432 parcel.as_native(),
433 &mut vec as *mut _ as *mut c_void,
434 Some(allocate_vec_with_buffer),
435 )
436 };
437 status_result(status)?;
438 // Safety: We are assuming that the NDK correctly
439 // initialized every element of the vector by now, so we
440 // know that all the UninitTypes are now properly
441 // initialized.
442 let vec: Option<Vec<Self>> = unsafe {
443 vec.map(|vec| vec_assume_init(vec))
444 };
445 Ok(vec)
446 }
447 }
448 };
449 }
450
451 impl<T: DeserializeOption> DeserializeArray for Option<T> {}
452 impl<T: SerializeOption> SerializeArray for Option<T> {}
453
454 parcelable_primitives! {
455 impl Serialize for bool = sys::AParcel_writeBool;
456 impl Deserialize for bool = sys::AParcel_readBool;
457
458 // This is only safe because `Option<Vec<u8>>` is interchangeable with
459 // `Option<Vec<i8>>` (what the allocator function actually allocates.
460 impl DeserializeArray for u8 = sys::AParcel_readByteArray;
461
462 impl Serialize for i8 = sys::AParcel_writeByte;
463 impl Deserialize for i8 = sys::AParcel_readByte;
464 impl SerializeArray for i8 = sys::AParcel_writeByteArray;
465 impl DeserializeArray for i8 = sys::AParcel_readByteArray;
466
467 impl Serialize for u16 = sys::AParcel_writeChar;
468 impl Deserialize for u16 = sys::AParcel_readChar;
469 impl SerializeArray for u16 = sys::AParcel_writeCharArray;
470 impl DeserializeArray for u16 = sys::AParcel_readCharArray;
471
472 // This is only safe because `Option<Vec<i16>>` is interchangeable with
473 // `Option<Vec<u16>>` (what the allocator function actually allocates.
474 impl DeserializeArray for i16 = sys::AParcel_readCharArray;
475
476 impl Serialize for u32 = sys::AParcel_writeUint32;
477 impl Deserialize for u32 = sys::AParcel_readUint32;
478 impl SerializeArray for u32 = sys::AParcel_writeUint32Array;
479 impl DeserializeArray for u32 = sys::AParcel_readUint32Array;
480
481 impl Serialize for i32 = sys::AParcel_writeInt32;
482 impl Deserialize for i32 = sys::AParcel_readInt32;
483 impl SerializeArray for i32 = sys::AParcel_writeInt32Array;
484 impl DeserializeArray for i32 = sys::AParcel_readInt32Array;
485
486 impl Serialize for u64 = sys::AParcel_writeUint64;
487 impl Deserialize for u64 = sys::AParcel_readUint64;
488 impl SerializeArray for u64 = sys::AParcel_writeUint64Array;
489 impl DeserializeArray for u64 = sys::AParcel_readUint64Array;
490
491 impl Serialize for i64 = sys::AParcel_writeInt64;
492 impl Deserialize for i64 = sys::AParcel_readInt64;
493 impl SerializeArray for i64 = sys::AParcel_writeInt64Array;
494 impl DeserializeArray for i64 = sys::AParcel_readInt64Array;
495
496 impl Serialize for f32 = sys::AParcel_writeFloat;
497 impl Deserialize for f32 = sys::AParcel_readFloat;
498 impl SerializeArray for f32 = sys::AParcel_writeFloatArray;
499 impl DeserializeArray for f32 = sys::AParcel_readFloatArray;
500
501 impl Serialize for f64 = sys::AParcel_writeDouble;
502 impl Deserialize for f64 = sys::AParcel_readDouble;
503 impl SerializeArray for f64 = sys::AParcel_writeDoubleArray;
504 impl DeserializeArray for f64 = sys::AParcel_readDoubleArray;
505 }
506
507 impl SerializeArray for bool {}
508 impl DeserializeArray for bool {}
509
510 impl Serialize for u8 {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>511 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
512 (*self as i8).serialize(parcel)
513 }
514 }
515
516 impl Deserialize for u8 {
517 type UninitType = Self;
uninit() -> Self::UninitType518 fn uninit() -> Self::UninitType {
519 Self::UninitType::default()
520 }
from_init(value: Self) -> Self::UninitType521 fn from_init(value: Self) -> Self::UninitType {
522 value
523 }
524
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>525 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
526 i8::deserialize(parcel).map(|v| v as u8)
527 }
528 }
529
530 impl SerializeArray for u8 {
serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()>531 fn serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()> {
532 // Safety: `Parcel` always contains a valid pointer to an
533 // `AParcel`. If the slice is > 0 length, `slice.as_ptr()` will be a
534 // valid pointer to an array of elements of type `$ty`. If the slice
535 // length is 0, `slice.as_ptr()` may be dangling, but this is safe
536 // since the pointer is not dereferenced if the length parameter is
537 // 0.
538 let status = unsafe {
539 sys::AParcel_writeByteArray(
540 parcel.as_native_mut(),
541 slice.as_ptr() as *const i8,
542 slice.len().try_into().or(Err(StatusCode::BAD_VALUE))?,
543 )
544 };
545 status_result(status)
546 }
547 }
548
549 impl Serialize for i16 {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>550 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
551 (*self as u16).serialize(parcel)
552 }
553 }
554
555 impl Deserialize for i16 {
556 type UninitType = Self;
uninit() -> Self::UninitType557 fn uninit() -> Self::UninitType {
558 Self::UninitType::default()
559 }
from_init(value: Self) -> Self::UninitType560 fn from_init(value: Self) -> Self::UninitType {
561 value
562 }
563
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>564 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
565 u16::deserialize(parcel).map(|v| v as i16)
566 }
567 }
568
569 impl SerializeArray for i16 {
serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()>570 fn serialize_array(slice: &[Self], parcel: &mut BorrowedParcel<'_>) -> Result<()> {
571 // Safety: `Parcel` always contains a valid pointer to an
572 // `AParcel`. If the slice is > 0 length, `slice.as_ptr()` will be a
573 // valid pointer to an array of elements of type `$ty`. If the slice
574 // length is 0, `slice.as_ptr()` may be dangling, but this is safe
575 // since the pointer is not dereferenced if the length parameter is
576 // 0.
577 let status = unsafe {
578 sys::AParcel_writeCharArray(
579 parcel.as_native_mut(),
580 slice.as_ptr() as *const u16,
581 slice.len().try_into().or(Err(StatusCode::BAD_VALUE))?,
582 )
583 };
584 status_result(status)
585 }
586 }
587
588 impl SerializeOption for str {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>589 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
590 match this {
591 // Safety: `Parcel` always contains a valid pointer to an
592 // `AParcel`. If the string pointer is null,
593 // `AParcel_writeString` requires that the length is -1 to
594 // indicate that we want to serialize a null string.
595 None => unsafe {
596 status_result(sys::AParcel_writeString(parcel.as_native_mut(), ptr::null(), -1))
597 },
598 // Safety: `Parcel` always contains a valid pointer to an
599 // `AParcel`. `AParcel_writeString` assumes that we pass a utf-8
600 // string pointer of `length` bytes, which is what str in Rust
601 // is. The docstring for `AParcel_writeString` says that the
602 // string input should be null-terminated, but it doesn't
603 // actually rely on that fact in the code. If this ever becomes
604 // necessary, we will need to null-terminate the str buffer
605 // before sending it.
606 Some(s) => unsafe {
607 status_result(sys::AParcel_writeString(
608 parcel.as_native_mut(),
609 s.as_ptr() as *const c_char,
610 s.as_bytes().len().try_into().or(Err(StatusCode::BAD_VALUE))?,
611 ))
612 },
613 }
614 }
615 }
616
617 impl Serialize for str {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>618 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
619 Some(self).serialize(parcel)
620 }
621 }
622
623 impl SerializeArray for &str {}
624
625 impl Serialize for String {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>626 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
627 Some(self.as_str()).serialize(parcel)
628 }
629 }
630
631 impl SerializeArray for String {}
632
633 impl SerializeOption for String {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>634 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
635 SerializeOption::serialize_option(this.map(String::as_str), parcel)
636 }
637 }
638
639 impl Deserialize for Option<String> {
640 type UninitType = Self;
uninit() -> Self::UninitType641 fn uninit() -> Self::UninitType {
642 Self::UninitType::default()
643 }
from_init(value: Self) -> Self::UninitType644 fn from_init(value: Self) -> Self::UninitType {
645 value
646 }
647
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>648 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
649 let mut vec: Option<Vec<u8>> = None;
650 // Safety: `Parcel` always contains a valid pointer to an `AParcel`.
651 // `Option<Vec<u8>>` is equivalent to the expected `Option<Vec<i8>>`
652 // for `allocate_vec`, so `vec` is safe to pass as the opaque data
653 // pointer on platforms where char is signed.
654 let status = unsafe {
655 sys::AParcel_readString(
656 parcel.as_native(),
657 &mut vec as *mut _ as *mut c_void,
658 Some(allocate_vec_with_buffer),
659 )
660 };
661
662 status_result(status)?;
663 vec.map(|mut s| {
664 // The vector includes a null-terminator and we don't want the
665 // string to be null-terminated for Rust.
666 s.pop();
667 String::from_utf8(s).or(Err(StatusCode::BAD_VALUE))
668 })
669 .transpose()
670 }
671 }
672
673 impl DeserializeArray for Option<String> {}
674
675 impl Deserialize for String {
676 type UninitType = Self;
uninit() -> Self::UninitType677 fn uninit() -> Self::UninitType {
678 Self::UninitType::default()
679 }
from_init(value: Self) -> Self::UninitType680 fn from_init(value: Self) -> Self::UninitType {
681 value
682 }
683
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>684 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
685 Deserialize::deserialize(parcel).transpose().unwrap_or(Err(StatusCode::UNEXPECTED_NULL))
686 }
687 }
688
689 impl DeserializeArray for String {}
690
691 impl<T: SerializeArray> Serialize for [T] {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>692 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
693 SerializeArray::serialize_array(self, parcel)
694 }
695 }
696
697 impl<T: SerializeArray> Serialize for Vec<T> {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>698 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
699 SerializeArray::serialize_array(&self[..], parcel)
700 }
701 }
702
703 impl<T: SerializeArray> SerializeOption for [T] {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>704 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
705 if let Some(v) = this {
706 SerializeArray::serialize_array(v, parcel)
707 } else {
708 parcel.write(&-1i32)
709 }
710 }
711 }
712
713 impl<T: SerializeArray> SerializeOption for Vec<T> {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>714 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
715 SerializeOption::serialize_option(this.map(Vec::as_slice), parcel)
716 }
717 }
718
719 impl<T: DeserializeArray> Deserialize for Vec<T> {
720 type UninitType = Self;
uninit() -> Self::UninitType721 fn uninit() -> Self::UninitType {
722 Self::UninitType::default()
723 }
from_init(value: Self) -> Self::UninitType724 fn from_init(value: Self) -> Self::UninitType {
725 value
726 }
727
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>728 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
729 DeserializeArray::deserialize_array(parcel)
730 .transpose()
731 .unwrap_or(Err(StatusCode::UNEXPECTED_NULL))
732 }
733 }
734
735 impl<T: DeserializeArray> DeserializeOption for Vec<T> {
deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>>736 fn deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>> {
737 DeserializeArray::deserialize_array(parcel)
738 }
739 }
740
741 impl<T: SerializeArray, const N: usize> Serialize for [T; N] {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>742 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
743 // forwards to T::serialize_array.
744 SerializeArray::serialize_array(self, parcel)
745 }
746 }
747
748 impl<T: SerializeArray, const N: usize> SerializeOption for [T; N] {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>749 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
750 SerializeOption::serialize_option(this.map(|arr| &arr[..]), parcel)
751 }
752 }
753
754 impl<T: SerializeArray, const N: usize> SerializeArray for [T; N] {}
755
756 impl<T: DeserializeArray, const N: usize> Deserialize for [T; N] {
757 type UninitType = [T::UninitType; N];
uninit() -> Self::UninitType758 fn uninit() -> Self::UninitType {
759 [(); N].map(|_| T::uninit())
760 }
from_init(value: Self) -> Self::UninitType761 fn from_init(value: Self) -> Self::UninitType {
762 value.map(T::from_init)
763 }
764
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>765 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
766 let vec = DeserializeArray::deserialize_array(parcel)
767 .transpose()
768 .unwrap_or(Err(StatusCode::UNEXPECTED_NULL))?;
769 vec.try_into().or(Err(StatusCode::BAD_VALUE))
770 }
771 }
772
773 impl<T: DeserializeArray, const N: usize> DeserializeOption for [T; N] {
deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>>774 fn deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>> {
775 let vec = DeserializeArray::deserialize_array(parcel)?;
776 vec.map(|v| v.try_into().or(Err(StatusCode::BAD_VALUE))).transpose()
777 }
778 }
779
780 impl<T: DeserializeArray, const N: usize> DeserializeArray for [T; N] {}
781
782 impl Serialize for Stability {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>783 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
784 i32::from(*self).serialize(parcel)
785 }
786 }
787
788 impl Deserialize for Stability {
789 type UninitType = Self;
uninit() -> Self::UninitType790 fn uninit() -> Self::UninitType {
791 Self::UninitType::default()
792 }
from_init(value: Self) -> Self::UninitType793 fn from_init(value: Self) -> Self::UninitType {
794 value
795 }
796
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>797 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
798 i32::deserialize(parcel).and_then(Stability::try_from)
799 }
800 }
801
802 impl Serialize for Status {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>803 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
804 // Safety: `Parcel` always contains a valid pointer to an `AParcel`
805 // and `Status` always contains a valid pointer to an `AStatus`, so
806 // both parameters are valid and safe. This call does not take
807 // ownership of either of its parameters.
808 unsafe {
809 status_result(sys::AParcel_writeStatusHeader(parcel.as_native_mut(), self.as_native()))
810 }
811 }
812 }
813
814 impl Deserialize for Status {
815 type UninitType = Option<Self>;
uninit() -> Self::UninitType816 fn uninit() -> Self::UninitType {
817 Self::UninitType::default()
818 }
from_init(value: Self) -> Self::UninitType819 fn from_init(value: Self) -> Self::UninitType {
820 Some(value)
821 }
822
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>823 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
824 let mut status_ptr = ptr::null_mut();
825 let ret_status =
826 // Safety: `Parcel` always contains a valid pointer to an
827 // `AParcel`. We pass a mutable out pointer which will be
828 // assigned a valid `AStatus` pointer if the function returns
829 // status OK. This function passes ownership of the status
830 // pointer to the caller, if it was assigned.
831 unsafe { sys::AParcel_readStatusHeader(parcel.as_native(), &mut status_ptr) };
832 status_result(ret_status)?;
833 // Safety: At this point, the return status of the read call was ok,
834 // so we know that `status_ptr` is a valid, owned pointer to an
835 // `AStatus`, from which we can safely construct a `Status` object.
836 Ok(unsafe { Status::from_ptr(status_ptr) })
837 }
838 }
839
840 impl<T: Serialize + FromIBinder + ?Sized> Serialize for Strong<T> {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>841 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
842 Serialize::serialize(&**self, parcel)
843 }
844 }
845
846 impl<T: SerializeOption + FromIBinder + ?Sized> SerializeOption for Strong<T> {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>847 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
848 SerializeOption::serialize_option(this.map(|b| &**b), parcel)
849 }
850 }
851
852 impl<T: Serialize + FromIBinder + ?Sized> SerializeArray for Strong<T> {}
853
854 impl<T: FromIBinder + ?Sized> Deserialize for Strong<T> {
855 type UninitType = Option<Strong<T>>;
uninit() -> Self::UninitType856 fn uninit() -> Self::UninitType {
857 Self::UninitType::default()
858 }
from_init(value: Self) -> Self::UninitType859 fn from_init(value: Self) -> Self::UninitType {
860 Some(value)
861 }
862
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>863 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
864 let ibinder: SpIBinder = parcel.read()?;
865 FromIBinder::try_from(ibinder)
866 }
867 }
868
869 struct AssertIBinder;
870 impl Interface for AssertIBinder {}
871 impl FromIBinder for AssertIBinder {
872 // This is only needed so we can assert on the size of Strong<AssertIBinder>
try_from(_: SpIBinder) -> Result<Strong<Self>>873 fn try_from(_: SpIBinder) -> Result<Strong<Self>> {
874 unimplemented!()
875 }
876 }
877
878 impl<T: FromIBinder + ?Sized> DeserializeOption for Strong<T> {
deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>>879 fn deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>> {
880 let ibinder: Option<SpIBinder> = parcel.read()?;
881 ibinder.map(FromIBinder::try_from).transpose()
882 }
883 }
884
885 impl<T: FromIBinder + ?Sized> DeserializeArray for Strong<T> {}
886
887 // We need these to support Option<&T> for all T
888 impl<T: Serialize + ?Sized> Serialize for &T {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>889 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
890 Serialize::serialize(*self, parcel)
891 }
892 }
893
894 impl<T: SerializeOption + ?Sized> SerializeOption for &T {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>895 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
896 SerializeOption::serialize_option(this.copied(), parcel)
897 }
898 }
899
900 impl<T: SerializeOption> Serialize for Option<T> {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>901 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
902 SerializeOption::serialize_option(self.as_ref(), parcel)
903 }
904 }
905
906 impl<T: DeserializeOption> Deserialize for Option<T> {
907 type UninitType = Self;
uninit() -> Self::UninitType908 fn uninit() -> Self::UninitType {
909 Self::UninitType::default()
910 }
from_init(value: Self) -> Self::UninitType911 fn from_init(value: Self) -> Self::UninitType {
912 value
913 }
914
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>915 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
916 DeserializeOption::deserialize_option(parcel)
917 }
918
deserialize_from(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()>919 fn deserialize_from(&mut self, parcel: &BorrowedParcel<'_>) -> Result<()> {
920 DeserializeOption::deserialize_option_from(self, parcel)
921 }
922 }
923
924 /// Implement `Serialize` trait and friends for a parcelable
925 ///
926 /// This is an internal macro used by the AIDL compiler to implement
927 /// `Serialize`, `SerializeArray` and `SerializeOption` for
928 /// structured parcelables. The target type must implement the
929 /// `Parcelable` trait.
930 #[macro_export]
931 macro_rules! impl_serialize_for_parcelable {
932 ($parcelable:ident) => {
933 $crate::impl_serialize_for_parcelable!($parcelable < >);
934 };
935 ($parcelable:ident < $( $param:ident ),* , >) => {
936 $crate::impl_serialize_for_parcelable!($parcelable < $($param),* >);
937 };
938 ($parcelable:ident < $( $param:ident ),* > ) => {
939 impl < $($param),* > $crate::binder_impl::Serialize for $parcelable < $($param),* > {
940 fn serialize(
941 &self,
942 parcel: &mut $crate::binder_impl::BorrowedParcel<'_>,
943 ) -> std::result::Result<(), $crate::StatusCode> {
944 <Self as $crate::binder_impl::SerializeOption>::serialize_option(Some(self), parcel)
945 }
946 }
947
948 impl < $($param),* > $crate::binder_impl::SerializeArray for $parcelable < $($param),* > {}
949
950 impl < $($param),* > $crate::binder_impl::SerializeOption for $parcelable < $($param),* > {
951 fn serialize_option(
952 this: Option<&Self>,
953 parcel: &mut $crate::binder_impl::BorrowedParcel<'_>,
954 ) -> std::result::Result<(), $crate::StatusCode> {
955 if let Some(this) = this {
956 use $crate::Parcelable;
957 parcel.write(&$crate::binder_impl::NON_NULL_PARCELABLE_FLAG)?;
958 this.write_to_parcel(parcel)
959 } else {
960 parcel.write(&$crate::binder_impl::NULL_PARCELABLE_FLAG)
961 }
962 }
963 }
964 };
965 }
966
967 /// Implement `Deserialize` trait and friends for a parcelable
968 ///
969 /// This is an internal macro used by the AIDL compiler to implement
970 /// `Deserialize`, `DeserializeArray` and `DeserializeOption` for
971 /// structured parcelables. The target type must implement the
972 /// `Parcelable` trait.
973 #[macro_export]
974 macro_rules! impl_deserialize_for_parcelable {
975 ($parcelable:ident) => {
976 $crate::impl_deserialize_for_parcelable!($parcelable < >);
977 };
978 ($parcelable:ident < $( $param:ident ),* , >) => {
979 $crate::impl_deserialize_for_parcelable!($parcelable < $($param),* >);
980 };
981 ($parcelable:ident < $( $param:ident ),* > ) => {
982 impl < $($param: Default),* > $crate::binder_impl::Deserialize for $parcelable < $($param),* > {
983 type UninitType = Self;
984 fn uninit() -> Self::UninitType { Self::UninitType::default() }
985 fn from_init(value: Self) -> Self::UninitType { value }
986 fn deserialize(
987 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
988 ) -> std::result::Result<Self, $crate::StatusCode> {
989 $crate::binder_impl::DeserializeOption::deserialize_option(parcel)
990 .transpose()
991 .unwrap_or(Err($crate::StatusCode::UNEXPECTED_NULL))
992 }
993 fn deserialize_from(
994 &mut self,
995 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
996 ) -> std::result::Result<(), $crate::StatusCode> {
997 let status: i32 = parcel.read()?;
998 if status == $crate::binder_impl::NULL_PARCELABLE_FLAG {
999 Err($crate::StatusCode::UNEXPECTED_NULL)
1000 } else {
1001 use $crate::Parcelable;
1002 self.read_from_parcel(parcel)
1003 }
1004 }
1005 }
1006
1007 impl < $($param: Default),* > $crate::binder_impl::DeserializeArray for $parcelable < $($param),* > {}
1008
1009 impl < $($param: Default),* > $crate::binder_impl::DeserializeOption for $parcelable < $($param),* > {
1010 fn deserialize_option(
1011 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1012 ) -> std::result::Result<Option<Self>, $crate::StatusCode> {
1013 let mut result = None;
1014 Self::deserialize_option_from(&mut result, parcel)?;
1015 Ok(result)
1016 }
1017 fn deserialize_option_from(
1018 this: &mut Option<Self>,
1019 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1020 ) -> std::result::Result<(), $crate::StatusCode> {
1021 let status: i32 = parcel.read()?;
1022 if status == $crate::binder_impl::NULL_PARCELABLE_FLAG {
1023 *this = None;
1024 Ok(())
1025 } else {
1026 use $crate::Parcelable;
1027 this.get_or_insert_with(Self::default).read_from_parcel(parcel)
1028 }
1029 }
1030 }
1031 };
1032 }
1033
1034 /// Implements `Serialize` trait and friends for an unstructured parcelable.
1035 ///
1036 /// The target type must implement the `UnstructuredParcelable` trait.
1037 #[macro_export]
1038 macro_rules! impl_serialize_for_unstructured_parcelable {
1039 ($parcelable:ident) => {
1040 $crate::impl_serialize_for_unstructured_parcelable!($parcelable < >);
1041 };
1042 ($parcelable:ident < $( $param:ident ),* , >) => {
1043 $crate::impl_serialize_for_unstructured_parcelable!($parcelable < $($param),* >);
1044 };
1045 ($parcelable:ident < $( $param:ident ),* > ) => {
1046 impl < $($param),* > $crate::binder_impl::Serialize for $parcelable < $($param),* > {
1047 fn serialize(
1048 &self,
1049 parcel: &mut $crate::binder_impl::BorrowedParcel<'_>,
1050 ) -> std::result::Result<(), $crate::StatusCode> {
1051 <Self as $crate::binder_impl::SerializeOption>::serialize_option(Some(self), parcel)
1052 }
1053 }
1054
1055 impl < $($param),* > $crate::binder_impl::SerializeArray for $parcelable < $($param),* > {}
1056
1057 impl < $($param),* > $crate::binder_impl::SerializeOption for $parcelable < $($param),* > {
1058 fn serialize_option(
1059 this: Option<&Self>,
1060 parcel: &mut $crate::binder_impl::BorrowedParcel<'_>,
1061 ) -> std::result::Result<(), $crate::StatusCode> {
1062 if let Some(this) = this {
1063 use $crate::binder_impl::UnstructuredParcelable;
1064 parcel.write(&$crate::binder_impl::NON_NULL_PARCELABLE_FLAG)?;
1065 this.write_to_parcel(parcel)
1066 } else {
1067 parcel.write(&$crate::binder_impl::NULL_PARCELABLE_FLAG)
1068 }
1069 }
1070 }
1071 };
1072 }
1073
1074 /// Implement `Deserialize` trait and friends for an unstructured parcelable
1075 ///
1076 /// The target type must implement the `UnstructuredParcelable` trait.
1077 #[macro_export]
1078 macro_rules! impl_deserialize_for_unstructured_parcelable {
1079 ($parcelable:ident) => {
1080 $crate::impl_deserialize_for_unstructured_parcelable!($parcelable < >);
1081 };
1082 ($parcelable:ident < $( $param:ident ),* , >) => {
1083 $crate::impl_deserialize_for_unstructured_parcelable!($parcelable < $($param),* >);
1084 };
1085 ($parcelable:ident < $( $param:ident ),* > ) => {
1086 impl < $($param: Default),* > $crate::binder_impl::Deserialize for $parcelable < $($param),* > {
1087 type UninitType = Option<Self>;
1088 fn uninit() -> Self::UninitType { None }
1089 fn from_init(value: Self) -> Self::UninitType { Some(value) }
1090 fn deserialize(
1091 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1092 ) -> std::result::Result<Self, $crate::StatusCode> {
1093 $crate::binder_impl::DeserializeOption::deserialize_option(parcel)
1094 .transpose()
1095 .unwrap_or(Err($crate::StatusCode::UNEXPECTED_NULL))
1096 }
1097 fn deserialize_from(
1098 &mut self,
1099 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1100 ) -> std::result::Result<(), $crate::StatusCode> {
1101 let status: i32 = parcel.read()?;
1102 if status == $crate::binder_impl::NULL_PARCELABLE_FLAG {
1103 Err($crate::StatusCode::UNEXPECTED_NULL)
1104 } else {
1105 use $crate::binder_impl::UnstructuredParcelable;
1106 self.read_from_parcel(parcel)
1107 }
1108 }
1109 }
1110
1111 impl < $($param: Default),* > $crate::binder_impl::DeserializeArray for $parcelable < $($param),* > {}
1112
1113 impl < $($param: Default),* > $crate::binder_impl::DeserializeOption for $parcelable < $($param),* > {
1114 fn deserialize_option(
1115 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1116 ) -> std::result::Result<Option<Self>, $crate::StatusCode> {
1117 let present: i32 = parcel.read()?;
1118 match present {
1119 $crate::binder_impl::NULL_PARCELABLE_FLAG => Ok(None),
1120 $crate::binder_impl::NON_NULL_PARCELABLE_FLAG => {
1121 use $crate::binder_impl::UnstructuredParcelable;
1122 Ok(Some(Self::from_parcel(parcel)?))
1123 }
1124 _ => Err(StatusCode::BAD_VALUE),
1125 }
1126 }
1127 fn deserialize_option_from(
1128 this: &mut Option<Self>,
1129 parcel: &$crate::binder_impl::BorrowedParcel<'_>,
1130 ) -> std::result::Result<(), $crate::StatusCode> {
1131 let present: i32 = parcel.read()?;
1132 match present {
1133 $crate::binder_impl::NULL_PARCELABLE_FLAG => {
1134 *this = None;
1135 Ok(())
1136 }
1137 $crate::binder_impl::NON_NULL_PARCELABLE_FLAG => {
1138 use $crate::binder_impl::UnstructuredParcelable;
1139 if let Some(this) = this {
1140 this.read_from_parcel(parcel)?;
1141 } else {
1142 *this = Some(Self::from_parcel(parcel)?);
1143 }
1144 Ok(())
1145 }
1146 _ => Err(StatusCode::BAD_VALUE),
1147 }
1148 }
1149 }
1150 };
1151 }
1152
1153 impl<T: Serialize> Serialize for Box<T> {
serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()>1154 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
1155 Serialize::serialize(&**self, parcel)
1156 }
1157 }
1158
1159 impl<T: Deserialize> Deserialize for Box<T> {
1160 type UninitType = Option<Self>;
uninit() -> Self::UninitType1161 fn uninit() -> Self::UninitType {
1162 Self::UninitType::default()
1163 }
from_init(value: Self) -> Self::UninitType1164 fn from_init(value: Self) -> Self::UninitType {
1165 Some(value)
1166 }
1167
deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self>1168 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
1169 Deserialize::deserialize(parcel).map(Box::new)
1170 }
1171 }
1172
1173 impl<T: SerializeOption> SerializeOption for Box<T> {
serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()>1174 fn serialize_option(this: Option<&Self>, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
1175 SerializeOption::serialize_option(this.map(|inner| &**inner), parcel)
1176 }
1177 }
1178
1179 impl<T: DeserializeOption> DeserializeOption for Box<T> {
deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>>1180 fn deserialize_option(parcel: &BorrowedParcel<'_>) -> Result<Option<Self>> {
1181 DeserializeOption::deserialize_option(parcel).map(|t| t.map(Box::new))
1182 }
1183 }
1184
1185 #[cfg(test)]
1186 mod tests {
1187 use super::*;
1188 use crate::parcel::Parcel;
1189
1190 #[test]
test_custom_parcelable()1191 fn test_custom_parcelable() {
1192 #[derive(Default)]
1193 struct Custom(u32, bool, String, Vec<String>);
1194
1195 impl Serialize for Custom {
1196 fn serialize(&self, parcel: &mut BorrowedParcel<'_>) -> Result<()> {
1197 self.0.serialize(parcel)?;
1198 self.1.serialize(parcel)?;
1199 self.2.serialize(parcel)?;
1200 self.3.serialize(parcel)
1201 }
1202 }
1203
1204 impl Deserialize for Custom {
1205 type UninitType = Self;
1206 fn uninit() -> Self::UninitType {
1207 Self::UninitType::default()
1208 }
1209 fn from_init(value: Self) -> Self::UninitType {
1210 value
1211 }
1212
1213 fn deserialize(parcel: &BorrowedParcel<'_>) -> Result<Self> {
1214 Ok(Custom(
1215 parcel.read()?,
1216 parcel.read()?,
1217 parcel.read()?,
1218 parcel.read::<Option<Vec<String>>>()?.unwrap(),
1219 ))
1220 }
1221 }
1222
1223 let string8 = "Custom Parcelable".to_string();
1224
1225 let s1 = "str1".to_string();
1226 let s2 = "str2".to_string();
1227 let s3 = "str3".to_string();
1228
1229 let strs = vec![s1, s2, s3];
1230
1231 let custom = Custom(123_456_789, true, string8, strs);
1232
1233 let mut parcel = Parcel::new();
1234 let start = parcel.get_data_position();
1235
1236 assert!(custom.serialize(&mut parcel.borrowed()).is_ok());
1237
1238 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1239 // made it any shorter since we got the position.
1240 unsafe {
1241 assert!(parcel.set_data_position(start).is_ok());
1242 }
1243
1244 let custom2 = Custom::deserialize(parcel.borrowed_ref()).unwrap();
1245
1246 assert_eq!(custom2.0, 123_456_789);
1247 assert!(custom2.1);
1248 assert_eq!(custom2.2, custom.2);
1249 assert_eq!(custom2.3, custom.3);
1250 }
1251
1252 #[test]
1253 #[allow(clippy::excessive_precision)]
test_slice_parcelables()1254 fn test_slice_parcelables() {
1255 let bools = [true, false, false, true];
1256
1257 let mut parcel = Parcel::new();
1258 let start = parcel.get_data_position();
1259
1260 assert!(bools.serialize(&mut parcel.borrowed()).is_ok());
1261
1262 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1263 // made it any shorter since we got the position.
1264 unsafe {
1265 assert!(parcel.set_data_position(start).is_ok());
1266 }
1267
1268 assert_eq!(parcel.read::<u32>().unwrap(), 4);
1269 assert_eq!(parcel.read::<u32>().unwrap(), 1);
1270 assert_eq!(parcel.read::<u32>().unwrap(), 0);
1271 assert_eq!(parcel.read::<u32>().unwrap(), 0);
1272 assert_eq!(parcel.read::<u32>().unwrap(), 1);
1273 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1274 // made it any shorter since we got the position.
1275 unsafe {
1276 assert!(parcel.set_data_position(start).is_ok());
1277 }
1278
1279 let vec = Vec::<bool>::deserialize(parcel.borrowed_ref()).unwrap();
1280
1281 assert_eq!(vec, [true, false, false, true]);
1282
1283 let u8s = [101u8, 255, 42, 117];
1284
1285 let mut parcel = Parcel::new();
1286 let start = parcel.get_data_position();
1287
1288 assert!(parcel.write(&u8s[..]).is_ok());
1289
1290 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1291 // made it any shorter since we got the position.
1292 unsafe {
1293 assert!(parcel.set_data_position(start).is_ok());
1294 }
1295
1296 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1297 assert_eq!(parcel.read::<u32>().unwrap(), 0x752aff65); // bytes
1298
1299 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1300 // made it any shorter since we got the position.
1301 unsafe {
1302 assert!(parcel.set_data_position(start).is_ok());
1303 }
1304
1305 let vec = Vec::<u8>::deserialize(parcel.borrowed_ref()).unwrap();
1306 assert_eq!(vec, [101, 255, 42, 117]);
1307
1308 let i8s = [-128i8, 127, 42, -117];
1309
1310 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1311 // made it any shorter since we got the position.
1312 unsafe {
1313 assert!(parcel.set_data_position(start).is_ok());
1314 }
1315
1316 assert!(parcel.write(&i8s[..]).is_ok());
1317
1318 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1319 // made it any shorter since we got the position.
1320 unsafe {
1321 assert!(parcel.set_data_position(start).is_ok());
1322 }
1323
1324 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1325 assert_eq!(parcel.read::<u32>().unwrap(), 0x8b2a7f80); // bytes
1326
1327 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1328 // made it any shorter since we got the position.
1329 unsafe {
1330 assert!(parcel.set_data_position(start).is_ok());
1331 }
1332
1333 let vec = Vec::<u8>::deserialize(parcel.borrowed_ref()).unwrap();
1334 assert_eq!(vec, [-128i8 as u8, 127, 42, -117i8 as u8]);
1335
1336 let u16s = [u16::max_value(), 12_345, 42, 117];
1337
1338 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1339 // made it any shorter since we got the position.
1340 unsafe {
1341 assert!(parcel.set_data_position(start).is_ok());
1342 }
1343 assert!(u16s.serialize(&mut parcel.borrowed()).is_ok());
1344 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1345 // made it any shorter since we got the position.
1346 unsafe {
1347 assert!(parcel.set_data_position(start).is_ok());
1348 }
1349
1350 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1351 assert_eq!(parcel.read::<u32>().unwrap(), 0xffff); // u16::max_value()
1352 assert_eq!(parcel.read::<u32>().unwrap(), 12345); // 12,345
1353 assert_eq!(parcel.read::<u32>().unwrap(), 42); // 42
1354 assert_eq!(parcel.read::<u32>().unwrap(), 117); // 117
1355
1356 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1357 // made it any shorter since we got the position.
1358 unsafe {
1359 assert!(parcel.set_data_position(start).is_ok());
1360 }
1361
1362 let vec = Vec::<u16>::deserialize(parcel.borrowed_ref()).unwrap();
1363
1364 assert_eq!(vec, [u16::max_value(), 12_345, 42, 117]);
1365
1366 let i16s = [i16::max_value(), i16::min_value(), 42, -117];
1367
1368 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1369 // made it any shorter since we got the position.
1370 unsafe {
1371 assert!(parcel.set_data_position(start).is_ok());
1372 }
1373 assert!(i16s.serialize(&mut parcel.borrowed()).is_ok());
1374 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1375 // made it any shorter since we got the position.
1376 unsafe {
1377 assert!(parcel.set_data_position(start).is_ok());
1378 }
1379
1380 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1381 assert_eq!(parcel.read::<u32>().unwrap(), 0x7fff); // i16::max_value()
1382 assert_eq!(parcel.read::<u32>().unwrap(), 0x8000); // i16::min_value()
1383 assert_eq!(parcel.read::<u32>().unwrap(), 42); // 42
1384 assert_eq!(parcel.read::<u32>().unwrap(), 0xff8b); // -117
1385
1386 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1387 // made it any shorter since we got the position.
1388 unsafe {
1389 assert!(parcel.set_data_position(start).is_ok());
1390 }
1391
1392 let vec = Vec::<i16>::deserialize(parcel.borrowed_ref()).unwrap();
1393
1394 assert_eq!(vec, [i16::max_value(), i16::min_value(), 42, -117]);
1395
1396 let u32s = [u32::max_value(), 12_345, 42, 117];
1397
1398 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1399 // made it any shorter since we got the position.
1400 unsafe {
1401 assert!(parcel.set_data_position(start).is_ok());
1402 }
1403 assert!(u32s.serialize(&mut parcel.borrowed()).is_ok());
1404 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1405 // made it any shorter since we got the position.
1406 unsafe {
1407 assert!(parcel.set_data_position(start).is_ok());
1408 }
1409
1410 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1411 assert_eq!(parcel.read::<u32>().unwrap(), 0xffffffff); // u32::max_value()
1412 assert_eq!(parcel.read::<u32>().unwrap(), 12345); // 12,345
1413 assert_eq!(parcel.read::<u32>().unwrap(), 42); // 42
1414 assert_eq!(parcel.read::<u32>().unwrap(), 117); // 117
1415
1416 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1417 // made it any shorter since we got the position.
1418 unsafe {
1419 assert!(parcel.set_data_position(start).is_ok());
1420 }
1421
1422 let vec = Vec::<u32>::deserialize(parcel.borrowed_ref()).unwrap();
1423
1424 assert_eq!(vec, [u32::max_value(), 12_345, 42, 117]);
1425
1426 let i32s = [i32::max_value(), i32::min_value(), 42, -117];
1427
1428 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1429 // made it any shorter since we got the position.
1430 unsafe {
1431 assert!(parcel.set_data_position(start).is_ok());
1432 }
1433 assert!(i32s.serialize(&mut parcel.borrowed()).is_ok());
1434 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1435 // made it any shorter since we got the position.
1436 unsafe {
1437 assert!(parcel.set_data_position(start).is_ok());
1438 }
1439
1440 assert_eq!(parcel.read::<u32>().unwrap(), 4); // 4 items
1441 assert_eq!(parcel.read::<u32>().unwrap(), 0x7fffffff); // i32::max_value()
1442 assert_eq!(parcel.read::<u32>().unwrap(), 0x80000000); // i32::min_value()
1443 assert_eq!(parcel.read::<u32>().unwrap(), 42); // 42
1444 assert_eq!(parcel.read::<u32>().unwrap(), 0xffffff8b); // -117
1445
1446 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1447 // made it any shorter since we got the position.
1448 unsafe {
1449 assert!(parcel.set_data_position(start).is_ok());
1450 }
1451
1452 let vec = Vec::<i32>::deserialize(parcel.borrowed_ref()).unwrap();
1453
1454 assert_eq!(vec, [i32::max_value(), i32::min_value(), 42, -117]);
1455
1456 let u64s = [u64::max_value(), 12_345, 42, 117];
1457
1458 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1459 // made it any shorter since we got the position.
1460 unsafe {
1461 assert!(parcel.set_data_position(start).is_ok());
1462 }
1463 assert!(u64s.serialize(&mut parcel.borrowed()).is_ok());
1464 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1465 // made it any shorter since we got the position.
1466 unsafe {
1467 assert!(parcel.set_data_position(start).is_ok());
1468 }
1469
1470 let vec = Vec::<u64>::deserialize(parcel.borrowed_ref()).unwrap();
1471
1472 assert_eq!(vec, [u64::max_value(), 12_345, 42, 117]);
1473
1474 let i64s = [i64::max_value(), i64::min_value(), 42, -117];
1475
1476 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1477 // made it any shorter since we got the position.
1478 unsafe {
1479 assert!(parcel.set_data_position(start).is_ok());
1480 }
1481 assert!(i64s.serialize(&mut parcel.borrowed()).is_ok());
1482 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1483 // made it any shorter since we got the position.
1484 unsafe {
1485 assert!(parcel.set_data_position(start).is_ok());
1486 }
1487
1488 let vec = Vec::<i64>::deserialize(parcel.borrowed_ref()).unwrap();
1489
1490 assert_eq!(vec, [i64::max_value(), i64::min_value(), 42, -117]);
1491
1492 let f32s = [std::f32::NAN, std::f32::INFINITY, 1.23456789, std::f32::EPSILON];
1493
1494 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1495 // made it any shorter since we got the position.
1496 unsafe {
1497 assert!(parcel.set_data_position(start).is_ok());
1498 }
1499 assert!(f32s.serialize(&mut parcel.borrowed()).is_ok());
1500 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1501 // made it any shorter since we got the position.
1502 unsafe {
1503 assert!(parcel.set_data_position(start).is_ok());
1504 }
1505
1506 let vec = Vec::<f32>::deserialize(parcel.borrowed_ref()).unwrap();
1507
1508 // NAN != NAN so we can't use it in the assert_eq:
1509 assert!(vec[0].is_nan());
1510 assert_eq!(vec[1..], f32s[1..]);
1511
1512 let f64s = [std::f64::NAN, std::f64::INFINITY, 1.234567890123456789, std::f64::EPSILON];
1513
1514 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1515 // made it any shorter since we got the position.
1516 unsafe {
1517 assert!(parcel.set_data_position(start).is_ok());
1518 }
1519 assert!(f64s.serialize(&mut parcel.borrowed()).is_ok());
1520 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1521 // made it any shorter since we got the position.
1522 unsafe {
1523 assert!(parcel.set_data_position(start).is_ok());
1524 }
1525
1526 let vec = Vec::<f64>::deserialize(parcel.borrowed_ref()).unwrap();
1527
1528 // NAN != NAN so we can't use it in the assert_eq:
1529 assert!(vec[0].is_nan());
1530 assert_eq!(vec[1..], f64s[1..]);
1531
1532 let s1 = "Hello, Binder!";
1533 let s2 = "This is a utf8 string.";
1534 let s3 = "Some more text here.";
1535 let s4 = "Embedded nulls \0 \0";
1536
1537 let strs = [s1, s2, s3, s4];
1538
1539 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1540 // made it any shorter since we got the position.
1541 unsafe {
1542 assert!(parcel.set_data_position(start).is_ok());
1543 }
1544 assert!(strs.serialize(&mut parcel.borrowed()).is_ok());
1545 // SAFETY: start is less than the current size of the parcel data buffer, because we haven't
1546 // made it any shorter since we got the position.
1547 unsafe {
1548 assert!(parcel.set_data_position(start).is_ok());
1549 }
1550
1551 let vec = Vec::<String>::deserialize(parcel.borrowed_ref()).unwrap();
1552
1553 assert_eq!(vec, strs);
1554 }
1555 }
1556