Generate correct Parcel verification code.
Make sure we pass in correct sizes into readBuffer()
and readEmbeddedBuffer() calls.
Same thing for HwBlob.readBuffer() and
HwBlob.readEmbeddedBuffer().
Bug: 30498700
Test: hidl_test, hidl_test_java, Youtube, Maps, Netflix, Camera
Change-Id: Ied2d9dc46538da3fcf5b1acbf1e7558e0743d3a2
Merged-In: Ied2d9dc46538da3fcf5b1acbf1e7558e0743d3a2
diff --git a/ArrayType.cpp b/ArrayType.cpp
index 3d34a9f..8168992 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -153,10 +153,18 @@
const std::string parcelObjDeref =
parcelObj + (parcelObjIsPointer ? "->" : ".");
+ size_t numArrayElements = 1;
+ for (auto size : mSizes) {
+ numArrayElements *= size->castSizeT();
+ }
if (isReader) {
out << "_hidl_err = "
<< parcelObjDeref
- << "readBuffer(&"
+ << "readBuffer("
+ << numArrayElements
+ << " * sizeof("
+ << baseType
+ << "), &"
<< parentName
<< ", "
<< " reinterpret_cast<const void **>("
@@ -165,10 +173,6 @@
handleError(out, mode);
} else {
- size_t numArrayElements = 1;
- for (auto size : mSizes) {
- numArrayElements *= size->castSizeT();
- }
out << "_hidl_err = "
<< parcelObjDeref
@@ -356,6 +360,9 @@
const std::string &parcelObj,
const std::string &argName,
bool isReader) const {
+ size_t align, size;
+ getAlignmentAndSize(&align, &size);
+
if (isReader) {
out << "new "
<< getJavaType(true /* forInitializer */)
@@ -369,11 +376,10 @@
if (isReader) {
out << parcelObj
- << ".readBuffer();\n";
+ << ".readBuffer("
+ << size
+ << " /* size */);\n";
} else {
- size_t align, size;
- getAlignmentAndSize(&align, &size);
-
out << "new android.os.HwBlob("
<< size
<< " /* size */);\n";