Fix bug in byte vector serialization
Byte vectors are used by the generated C++ code as the representation
of Java byte[]. This type is serialized as a packed byte array on
the java side.
Bug: 25012838
Test: integration tests for byte[] show this type crossing language
boundaries correctly.
(cherry picked from commit f0fc52b59be0bf39912f7b698d9bde26415a6096)
Change-Id: I0afd4c9655d642613fd9012c7c1e4e9fc4edd1db
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 4c80f43..3af48e5 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -745,25 +745,25 @@
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 = writeByte(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::writeInt32Vector(const std::vector<int32_t>& val)
@@ -1367,21 +1367,19 @@
return status;
}
- if (size < 0) {
- return BAD_VALUE;
+ if (size < 0 || size_t(size) > dataAvail()) {
+ status = BAD_VALUE;
+ return status;
}
-
+ const void* data = readInplace(size);
+ if (!data) {
+ status = BAD_VALUE;
+ return status;
+ }
val->resize(size);
+ memcpy(val->data(), data, size);
- for (auto& v : *val) {
- status = readByte(&v);
-
- if (status != OK) {
- return status;
- }
- }
-
- return OK;
+ return status;
}
status_t Parcel::readInt32Vector(std::vector<int32_t>* val) const {