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";