Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe441bf6 authored by Jooyung Han's avatar Jooyung Han Committed by Gerrit Code Review
Browse files

Merge changes from topic "ndk-rust-nullables"

* changes:
  libbinder_rs: (De)SerializeArray for Option<T>
  libbinder_ndk: read/writeVector for nullables
  Add new helper APIs to binder_parcel_fuzzer
parents 70adbc5f 7dcc56f2
Loading
Loading
Loading
Loading
+29 −17
Original line number Diff line number Diff line
@@ -550,8 +550,8 @@ binder_status_t AParcel_writeNullableStdVectorParcelableElement(AParcel* parcel,
                                                                const void* vectorData,
                                                                size_t index) {
    const std::optional<std::vector<P>>* vector =
            static_cast<const std::optional<std::vector<P>*>>(vectorData);
    return AParcel_writeNullableParcelable(parcel, vector->at(index));
            static_cast<const std::optional<std::vector<P>>*>(vectorData);
    return AParcel_writeNullableParcelable(parcel, (*vector)->at(index));
}

/**
@@ -561,7 +561,7 @@ template <typename P>
binder_status_t AParcel_readNullableStdVectorParcelableElement(const AParcel* parcel,
                                                               void* vectorData, size_t index) {
    std::optional<std::vector<P>>* vector = static_cast<std::optional<std::vector<P>>*>(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<ScopedFileDescrip
        AParcel* parcel, const void* vectorData, size_t index) {
    const std::vector<ScopedFileDescriptor>* vector =
            static_cast<const std::vector<ScopedFileDescriptor>*>(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<ScopedFileDescript
        const AParcel* parcel, void* vectorData, size_t index) {
    std::vector<ScopedFileDescriptor>* vector =
            static_cast<std::vector<ScopedFileDescriptor>*>(vectorData);
    int readFd;
    binder_status_t status = AParcel_readParcelFileDescriptor(parcel, &readFd);
    if (status == STATUS_OK) {
        if (readFd < 0) {
            return STATUS_UNEXPECTED_NULL;
    return AParcel_readRequiredParcelFileDescriptor(parcel, &vector->at(index));
}
        vector->at(index).set(readFd);

/**
 * Writes a ScopedFileDescriptor object inside a std::optional<std::vector<ScopedFileDescriptor>> at
 * index 'index' to 'parcel'.
 */
template <>
inline binder_status_t AParcel_writeNullableStdVectorParcelableElement<ScopedFileDescriptor>(
        AParcel* parcel, const void* vectorData, size_t index) {
    const std::optional<std::vector<ScopedFileDescriptor>>* vector =
            static_cast<const std::optional<std::vector<ScopedFileDescriptor>>*>(vectorData);
    return AParcel_writeNullableParcelFileDescriptor(parcel, (*vector)->at(index));
}
    return status;

/**
 * Reads a ScopedFileDescriptor object inside a std::optional<std::vector<ScopedFileDescriptor>> at
 * index 'index' from 'parcel'.
 */
template <>
inline binder_status_t AParcel_readNullableStdVectorParcelableElement<ScopedFileDescriptor>(
        const AParcel* parcel, void* vectorData, size_t index) {
    std::optional<std::vector<ScopedFileDescriptor>>* vector =
            static_cast<std::optional<std::vector<ScopedFileDescriptor>>*>(vectorData);
    return AParcel_readNullableParcelFileDescriptor(parcel, &(*vector)->at(index));
}

/**
+0 −4
Original line number Diff line number Diff line
@@ -94,8 +94,6 @@ impl SerializeOption for ParcelFileDescriptor {
    }
}

impl SerializeArray for Option<ParcelFileDescriptor> {}

impl DeserializeOption for ParcelFileDescriptor {
    fn deserialize_option(parcel: &Parcel) -> Result<Option<Self>> {
        let mut fd = -1i32;
@@ -126,8 +124,6 @@ impl DeserializeOption for ParcelFileDescriptor {
    }
}

impl DeserializeArray for Option<ParcelFileDescriptor> {}

impl Deserialize for ParcelFileDescriptor {
    fn deserialize(parcel: &Parcel) -> Result<Self> {
        Deserialize::deserialize(parcel)
+3 −4
Original line number Diff line number Diff line
@@ -383,6 +383,9 @@ macro_rules! impl_parcelable {
    };
}

impl<T: DeserializeOption> DeserializeArray for Option<T> {}
impl<T: SerializeOption> SerializeArray for Option<T> {}

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<String> {}

impl Deserialize for Option<String> {
    fn deserialize(parcel: &Parcel) -> Result<Self> {
        let mut vec: Option<Vec<u8>> = None;
+0 −3
Original line number Diff line number Diff line
@@ -429,8 +429,6 @@ impl SerializeOption for SpIBinder {
}

impl SerializeArray for SpIBinder {}
impl SerializeArray for Option<&SpIBinder> {}
impl SerializeArray for Option<SpIBinder> {}

impl Deserialize for SpIBinder {
    fn deserialize(parcel: &Parcel) -> Result<SpIBinder> {
@@ -448,7 +446,6 @@ impl DeserializeOption for SpIBinder {
}

impl DeserializeArray for SpIBinder {}
impl DeserializeArray for Option<SpIBinder> {}

/// A weak reference to a Binder remote object.
///
+5 −0
Original line number Diff line number Diff line
@@ -95,6 +95,11 @@ std::vector<ParcelRead<NdkParcelAdapter>> BINDER_NDK_PARCEL_READ_FUNCTIONS{
        PARCEL_READ(std::vector<std::string>, ndk::AParcel_readVector),
        PARCEL_READ(std::optional<std::vector<std::optional<std::string>>>, ndk::AParcel_readVector),
        PARCEL_READ(std::vector<SomeParcelable>, ndk::AParcel_readVector),
        PARCEL_READ(std::optional<std::vector<std::optional<SomeParcelable>>>, ndk::AParcel_readVector),
        PARCEL_READ(std::vector<ndk::SpAIBinder>, ndk::AParcel_readVector),
        PARCEL_READ(std::optional<std::vector<ndk::SpAIBinder>>, ndk::AParcel_readVector),
        PARCEL_READ(std::vector<ndk::ScopedFileDescriptor>, ndk::AParcel_readVector),
        PARCEL_READ(std::optional<std::vector<ndk::ScopedFileDescriptor>>, ndk::AParcel_readVector),
        PARCEL_READ(std::vector<int32_t>, ndk::AParcel_readVector),
        PARCEL_READ(std::optional<std::vector<int32_t>>, ndk::AParcel_readVector),
        PARCEL_READ(std::vector<uint32_t>, ndk::AParcel_readVector),