diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/binder/ndk/parcel.cpp | 24 | 
1 files changed, 21 insertions, 3 deletions
| diff --git a/libs/binder/ndk/parcel.cpp b/libs/binder/ndk/parcel.cpp index c320e8d6df..86930229ce 100644 --- a/libs/binder/ndk/parcel.cpp +++ b/libs/binder/ndk/parcel.cpp @@ -129,7 +129,13 @@ binder_status_t ReadArray(const AParcel* parcel, void* arrayData,      }      T* array; -    if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY; +    if (!allocator(arrayData, length, &array)) { +        if (length < 0) { +            return STATUS_UNEXPECTED_NULL; +        } else { +            return STATUS_NO_MEMORY; +        } +    }      if (length <= 0) return STATUS_OK;      if (array == nullptr) return STATUS_NO_MEMORY; @@ -157,7 +163,13 @@ binder_status_t ReadArray<char16_t>(const AParcel* parcel, void* arrayData,      }      char16_t* array; -    if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY; +    if (!allocator(arrayData, length, &array)) { +        if (length < 0) { +            return STATUS_UNEXPECTED_NULL; +        } else { +            return STATUS_NO_MEMORY; +        } +    }      if (length <= 0) return STATUS_OK;      if (array == nullptr) return STATUS_NO_MEMORY; @@ -204,7 +216,13 @@ binder_status_t ReadArray(const AParcel* parcel, void* arrayData, ArrayAllocator          return status;      } -    if (!allocator(arrayData, length)) return STATUS_NO_MEMORY; +    if (!allocator(arrayData, length)) { +        if (length < 0) { +            return STATUS_UNEXPECTED_NULL; +        } else { +            return STATUS_NO_MEMORY; +        } +    }      if (length <= 0) return STATUS_OK; |