From 2a2dd3bce23c6cc812922a676c13a9ff78487551 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Fri, 15 Oct 2021 07:03:34 +0900 Subject: Add new helper APIs to binder_parcel_fuzzer Bug: n/a Test: binder_parcel_fuzzer for a few minutes Change-Id: I149754ab7cf6df4a8cf3e775a4984c5b4688b7ef --- libs/binder/tests/parcel_fuzzer/binder_ndk.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libs') diff --git a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp index 6b783a4804..0974d8e952 100644 --- a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp +++ b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp @@ -95,6 +95,8 @@ std::vector> BINDER_NDK_PARCEL_READ_FUNCTIONS{ PARCEL_READ(std::vector, ndk::AParcel_readVector), PARCEL_READ(std::optional>>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), + PARCEL_READ(std::vector, ndk::AParcel_readVector), + PARCEL_READ(std::optional>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), PARCEL_READ(std::optional>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), -- cgit v1.2.3-59-g8ed1b From 9e0b56a2cddba12457699f5d8baaeb97292c6b71 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Sat, 16 Oct 2021 03:34:00 +0900 Subject: libbinder_ndk: read/writeVector for nullables readVector/writeVector now supports nullable parcelables and nullable ScopedFileDescriptors. Bug: n/a Test: binder_parcel_fuzzer Change-Id: I90dbfe337f5d40143f716330431ab58221311c8e --- .../ndk/include_cpp/android/binder_parcel_utils.h | 46 ++++++++++++++-------- libs/binder/tests/parcel_fuzzer/binder_ndk.cpp | 3 ++ 2 files changed, 32 insertions(+), 17 deletions(-) (limited to 'libs') diff --git a/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h b/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h index 4a7b66474a..2b18a0a1e0 100644 --- a/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h +++ b/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h @@ -550,8 +550,8 @@ binder_status_t AParcel_writeNullableStdVectorParcelableElement(AParcel* parcel, const void* vectorData, size_t index) { const std::optional>* vector = - static_cast*>>(vectorData); - return AParcel_writeNullableParcelable(parcel, vector->at(index)); + static_cast>*>(vectorData); + return AParcel_writeNullableParcelable(parcel, (*vector)->at(index)); } /** @@ -561,7 +561,7 @@ template binder_status_t AParcel_readNullableStdVectorParcelableElement(const AParcel* parcel, void* vectorData, size_t index) { std::optional>* vector = static_cast>*>(vectorData); - return AParcel_readNullableParcelable(parcel, &vector->at(index)); + return AParcel_readNullableParcelable(parcel, &(*vector)->at(index)); } /** @@ -573,11 +573,7 @@ inline binder_status_t AParcel_writeStdVectorParcelableElement* vector = static_cast*>(vectorData); - int writeFd = vector->at(index).get(); - if (writeFd < 0) { - return STATUS_UNEXPECTED_NULL; - } - return AParcel_writeParcelFileDescriptor(parcel, writeFd); + return AParcel_writeRequiredParcelFileDescriptor(parcel, vector->at(index)); } /** @@ -589,15 +585,31 @@ inline binder_status_t AParcel_readStdVectorParcelableElement* vector = static_cast*>(vectorData); - int readFd; - binder_status_t status = AParcel_readParcelFileDescriptor(parcel, &readFd); - if (status == STATUS_OK) { - if (readFd < 0) { - return STATUS_UNEXPECTED_NULL; - } - vector->at(index).set(readFd); - } - return status; + return AParcel_readRequiredParcelFileDescriptor(parcel, &vector->at(index)); +} + +/** + * Writes a ScopedFileDescriptor object inside a std::optional> at + * index 'index' to 'parcel'. + */ +template <> +inline binder_status_t AParcel_writeNullableStdVectorParcelableElement( + AParcel* parcel, const void* vectorData, size_t index) { + const std::optional>* vector = + static_cast>*>(vectorData); + return AParcel_writeNullableParcelFileDescriptor(parcel, (*vector)->at(index)); +} + +/** + * Reads a ScopedFileDescriptor object inside a std::optional> at + * index 'index' from 'parcel'. + */ +template <> +inline binder_status_t AParcel_readNullableStdVectorParcelableElement( + const AParcel* parcel, void* vectorData, size_t index) { + std::optional>* vector = + static_cast>*>(vectorData); + return AParcel_readNullableParcelFileDescriptor(parcel, &(*vector)->at(index)); } /** diff --git a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp index 0974d8e952..c0a762d1de 100644 --- a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp +++ b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp @@ -95,8 +95,11 @@ std::vector> BINDER_NDK_PARCEL_READ_FUNCTIONS{ PARCEL_READ(std::vector, ndk::AParcel_readVector), PARCEL_READ(std::optional>>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), + PARCEL_READ(std::optional>>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), PARCEL_READ(std::optional>, ndk::AParcel_readVector), + PARCEL_READ(std::vector, ndk::AParcel_readVector), + PARCEL_READ(std::optional>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), PARCEL_READ(std::optional>, ndk::AParcel_readVector), PARCEL_READ(std::vector, ndk::AParcel_readVector), -- cgit v1.2.3-59-g8ed1b From 7dcc56f291be627ddc84c8f5aac0f158342e4529 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Sat, 16 Oct 2021 03:39:59 +0900 Subject: libbinder_rs: (De)SerializeArray for Option To support read/write nullable array of parcelables, for T:(De)SerializeOption, provide (De)SerializeArray as well. Bug: n/a Test: aidl_integration_test Change-Id: I8c7e6de79a92fa9868335202837d14b138cdeb6d --- libs/binder/rust/src/parcel/file_descriptor.rs | 4 ---- libs/binder/rust/src/parcel/parcelable.rs | 7 +++---- libs/binder/rust/src/proxy.rs | 3 --- 3 files changed, 3 insertions(+), 11 deletions(-) (limited to 'libs') diff --git a/libs/binder/rust/src/parcel/file_descriptor.rs b/libs/binder/rust/src/parcel/file_descriptor.rs index f71a686959..8bcc5d0092 100644 --- a/libs/binder/rust/src/parcel/file_descriptor.rs +++ b/libs/binder/rust/src/parcel/file_descriptor.rs @@ -94,8 +94,6 @@ impl SerializeOption for ParcelFileDescriptor { } } -impl SerializeArray for Option {} - impl DeserializeOption for ParcelFileDescriptor { fn deserialize_option(parcel: &Parcel) -> Result> { let mut fd = -1i32; @@ -126,8 +124,6 @@ impl DeserializeOption for ParcelFileDescriptor { } } -impl DeserializeArray for Option {} - impl Deserialize for ParcelFileDescriptor { fn deserialize(parcel: &Parcel) -> Result { Deserialize::deserialize(parcel) diff --git a/libs/binder/rust/src/parcel/parcelable.rs b/libs/binder/rust/src/parcel/parcelable.rs index 499ef09e6a..ec00e1dc86 100644 --- a/libs/binder/rust/src/parcel/parcelable.rs +++ b/libs/binder/rust/src/parcel/parcelable.rs @@ -383,6 +383,9 @@ macro_rules! impl_parcelable { }; } +impl DeserializeArray for Option {} +impl SerializeArray for Option {} + parcelable_primitives! { impl Serialize for bool = sys::AParcel_writeBool; impl Deserialize for bool = sys::AParcel_readBool; @@ -537,8 +540,6 @@ impl SerializeOption for str { } } -impl SerializeArray for Option<&str> {} - impl Serialize for str { fn serialize(&self, parcel: &mut Parcel) -> Result<()> { Some(self).serialize(parcel) @@ -561,8 +562,6 @@ impl SerializeOption for String { } } -impl SerializeArray for Option {} - impl Deserialize for Option { fn deserialize(parcel: &Parcel) -> Result { let mut vec: Option> = None; diff --git a/libs/binder/rust/src/proxy.rs b/libs/binder/rust/src/proxy.rs index 6a4af077c5..2c5b0a8421 100644 --- a/libs/binder/rust/src/proxy.rs +++ b/libs/binder/rust/src/proxy.rs @@ -429,8 +429,6 @@ impl SerializeOption for SpIBinder { } impl SerializeArray for SpIBinder {} -impl SerializeArray for Option<&SpIBinder> {} -impl SerializeArray for Option {} impl Deserialize for SpIBinder { fn deserialize(parcel: &Parcel) -> Result { @@ -448,7 +446,6 @@ impl DeserializeOption for SpIBinder { } impl DeserializeArray for SpIBinder {} -impl DeserializeArray for Option {} /// A weak reference to a Binder remote object. /// -- cgit v1.2.3-59-g8ed1b