1 /* 2 * Copyright (C) 2022 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 binder::binder_impl::BorrowedParcel; 18 use binder::{ParcelFileDescriptor, Parcelable, SpIBinder}; 19 use binderReadParcelIface::aidl::parcelables::EmptyParcelable::EmptyParcelable; 20 use binderReadParcelIface::aidl::parcelables::GenericDataParcelable::GenericDataParcelable; 21 use binderReadParcelIface::aidl::parcelables::SingleDataParcelable::SingleDataParcelable; 22 23 macro_rules! read_parcel_interface { 24 ($data_type:ty) => { 25 |parcel: &BorrowedParcel<'_>| { 26 let _res = parcel.read::<$data_type>(); 27 } 28 }; 29 } 30 31 #[derive(Debug, Default)] 32 pub struct SomeParcelable { 33 pub data: i32, 34 } 35 36 impl binder::Parcelable for SomeParcelable { write_to_parcel( &self, parcel: &mut binder::binder_impl::BorrowedParcel, ) -> std::result::Result<(), binder::StatusCode>37 fn write_to_parcel( 38 &self, 39 parcel: &mut binder::binder_impl::BorrowedParcel, 40 ) -> std::result::Result<(), binder::StatusCode> { 41 parcel.sized_write(|subparcel| subparcel.write(&self.data)) 42 } 43 read_from_parcel( &mut self, parcel: &binder::binder_impl::BorrowedParcel, ) -> std::result::Result<(), binder::StatusCode>44 fn read_from_parcel( 45 &mut self, 46 parcel: &binder::binder_impl::BorrowedParcel, 47 ) -> std::result::Result<(), binder::StatusCode> { 48 parcel.sized_read(|subparcel| match subparcel.read() { 49 Ok(result) => { 50 self.data = result; 51 Ok(()) 52 } 53 Err(e) => Err(e), 54 }) 55 } 56 } 57 58 binder::impl_deserialize_for_parcelable!(SomeParcelable); 59 60 pub const READ_FUNCS: &[fn(&BorrowedParcel<'_>)] = &[ 61 //read basic types 62 read_parcel_interface!(bool), 63 read_parcel_interface!(i8), 64 read_parcel_interface!(i32), 65 read_parcel_interface!(i64), 66 read_parcel_interface!(f32), 67 read_parcel_interface!(f64), 68 read_parcel_interface!(u16), 69 read_parcel_interface!(u32), 70 read_parcel_interface!(u64), 71 read_parcel_interface!(String), 72 //read vec of basic types 73 read_parcel_interface!(Vec<i8>), 74 read_parcel_interface!(Vec<i32>), 75 read_parcel_interface!(Vec<i64>), 76 read_parcel_interface!(Vec<f32>), 77 read_parcel_interface!(Vec<f64>), 78 read_parcel_interface!(Vec<u16>), 79 read_parcel_interface!(Vec<u32>), 80 read_parcel_interface!(Vec<u64>), 81 read_parcel_interface!(Vec<String>), 82 read_parcel_interface!(Option<Vec<i8>>), 83 read_parcel_interface!(Option<Vec<i32>>), 84 read_parcel_interface!(Option<Vec<i64>>), 85 read_parcel_interface!(Option<Vec<f32>>), 86 read_parcel_interface!(Option<Vec<f64>>), 87 read_parcel_interface!(Option<Vec<u16>>), 88 read_parcel_interface!(Option<Vec<u32>>), 89 read_parcel_interface!(Option<Vec<u64>>), 90 read_parcel_interface!(Option<Vec<String>>), 91 read_parcel_interface!(ParcelFileDescriptor), 92 read_parcel_interface!(Vec<ParcelFileDescriptor>), 93 read_parcel_interface!(Vec<Option<ParcelFileDescriptor>>), 94 read_parcel_interface!(Option<Vec<ParcelFileDescriptor>>), 95 read_parcel_interface!(Option<Vec<Option<ParcelFileDescriptor>>>), 96 read_parcel_interface!(SpIBinder), 97 read_parcel_interface!(Vec<SpIBinder>), 98 read_parcel_interface!(Vec<Option<SpIBinder>>), 99 read_parcel_interface!(Option<Vec<SpIBinder>>), 100 read_parcel_interface!(Option<Vec<Option<SpIBinder>>>), 101 read_parcel_interface!(SomeParcelable), 102 read_parcel_interface!(Vec<SomeParcelable>), 103 read_parcel_interface!(Vec<Option<SomeParcelable>>), 104 read_parcel_interface!(Option<Vec<SomeParcelable>>), 105 read_parcel_interface!(Option<Vec<Option<SomeParcelable>>>), 106 // Fuzz read_from_parcel for AIDL generated parcelables 107 |parcel| { 108 let mut empty_parcelable: EmptyParcelable = EmptyParcelable::default(); 109 match empty_parcelable.read_from_parcel(parcel) { 110 Ok(result) => result, 111 Err(e) => { 112 println!("EmptyParcelable: error occurred while reading from a parcel: {:?}", e) 113 } 114 } 115 }, 116 |parcel| { 117 let mut single_parcelable: SingleDataParcelable = SingleDataParcelable::default(); 118 match single_parcelable.read_from_parcel(parcel) { 119 Ok(result) => result, 120 Err(e) => println!( 121 "SingleDataParcelable: error occurred while reading from a parcel: {:?}", 122 e 123 ), 124 } 125 }, 126 |parcel| { 127 let mut generic_parcelable: GenericDataParcelable = GenericDataParcelable::default(); 128 match generic_parcelable.read_from_parcel(parcel) { 129 Ok(result) => result, 130 Err(e) => println!( 131 "GenericDataParcelable: error occurred while reading from a parcel: {:?}", 132 e 133 ), 134 } 135 }, 136 ]; 137