diff options
-rw-r--r-- | libs/binder/Parcel.cpp | 196 |
1 files changed, 46 insertions, 150 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 45bf636505..c808948e0f 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -750,43 +750,23 @@ restart_write: return NULL; } -status_t Parcel::writeByteVector(const std::vector<int8_t>& val) -{ - status_t status; - if (val.size() > std::numeric_limits<int32_t>::max()) { - status = BAD_VALUE; - return status; - } - - status = writeInt32(val.size()); - if (status != OK) { - return status; - } - - void* data = writeInplace(val.size()); - if (!data) { - status = BAD_VALUE; - return status; - } - - memcpy(data, val.data(), val.size()); - return status; -} +namespace { -status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) -{ +template<typename T, typename U> +status_t unsafeWriteTypedVector(const std::vector<T>& val, Parcel* p, + status_t(Parcel::*write_func)(U)) { if (val.size() > std::numeric_limits<int32_t>::max()) { return BAD_VALUE; } - status_t status = writeInt32(val.size()); + status_t status = p->writeInt32(val.size()); if (status != OK) { return status; } for (const auto& item : val) { - status = writeInt32(item); + status = (p->*write_func)(item); if (status != OK) { return status; @@ -796,142 +776,76 @@ status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) return OK; } -status_t Parcel::writeInt64Vector(const std::vector<int64_t>& val) -{ - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } - - for (const auto& item : val) { - status = writeInt64(item); - - if (status != OK) { - return status; - } - } +template<typename T> +status_t writeTypedVector(const std::vector<T>& val, Parcel* p, + status_t(Parcel::*write_func)(const T&)) { + return unsafeWriteTypedVector(val, p, write_func); +} - return OK; +template<typename T> +status_t writeTypedVector(const std::vector<T>& val, Parcel* p, + status_t(Parcel::*write_func)(T)) { + return unsafeWriteTypedVector(val, p, write_func); } -status_t Parcel::writeFloatVector(const std::vector<float>& val) +} // namespace + +status_t Parcel::writeByteVector(const std::vector<int8_t>& val) { + status_t status; if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; + status = BAD_VALUE; + return status; } - status_t status = writeInt32(val.size()); - + status = writeInt32(val.size()); if (status != OK) { return status; } - for (const auto& item : val) { - status = writeFloat(item); - - if (status != OK) { - return status; - } + void* data = writeInplace(val.size()); + if (!data) { + status = BAD_VALUE; + return status; } - return OK; + memcpy(data, val.data(), val.size()); + return status; } -status_t Parcel::writeDoubleVector(const std::vector<double>& val) +status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val) { - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } + return writeTypedVector(val, this, &Parcel::writeInt32); +} - for (const auto& item : val) { - status = writeDouble(item); +status_t Parcel::writeInt64Vector(const std::vector<int64_t>& val) +{ + return writeTypedVector(val, this, &Parcel::writeInt64); +} - if (status != OK) { - return status; - } - } +status_t Parcel::writeFloatVector(const std::vector<float>& val) +{ + return writeTypedVector(val, this, &Parcel::writeFloat); +} - return OK; +status_t Parcel::writeDoubleVector(const std::vector<double>& val) +{ + return writeTypedVector(val, this, &Parcel::writeDouble); } status_t Parcel::writeBoolVector(const std::vector<bool>& val) { - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } - - for (const auto& item : val) { - status = writeBool(item); - - if (status != OK) { - return status; - } - } - - return OK; + return writeTypedVector(val, this, &Parcel::writeBool); } status_t Parcel::writeCharVector(const std::vector<char16_t>& val) { - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } - - for (const auto& item : val) { - status = writeChar(item); - - if (status != OK) { - return status; - } - } - - return OK; + return writeTypedVector(val, this, &Parcel::writeChar); } status_t Parcel::writeString16Vector(const std::vector<String16>& val) { - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } - - for (const auto& item : val) { - status = writeString16(item); - - if (status != OK) { - return status; - } - } - - return OK; + return writeTypedVector(val, this, &Parcel::writeString16); } status_t Parcel::writeInt32(int32_t val) @@ -1080,25 +994,7 @@ status_t Parcel::writeStrongBinder(const sp<IBinder>& val) status_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val) { - if (val.size() > std::numeric_limits<int32_t>::max()) { - return BAD_VALUE; - } - - status_t status = writeInt32(val.size()); - - if (status != OK) { - return status; - } - - for (const auto& item : val) { - status = writeStrongBinder(item); - - if (status != OK) { - return status; - } - } - - return OK; + return writeTypedVector(val, this, &Parcel::writeStrongBinder); } status_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const { |