OSDN Git Service

Fix byte and char Get32
authorMathieu Chartier <mathieuc@google.com>
Fri, 6 Mar 2015 19:33:36 +0000 (11:33 -0800)
committerMathieu Chartier <mathieuc@google.com>
Fri, 6 Mar 2015 19:44:12 +0000 (11:44 -0800)
8 bit and 16 bit fields aren't necessarily 32 bit aligned due to
field packing. This was causing SIGBUS for hprof dumping some apps.

Bug: 19627999
Change-Id: Ifd68b281b2a23b9ed3c6f8780c99870643366c7e

runtime/hprof/hprof.cc

index d2e93bc..7da22b1 100644 (file)
@@ -1010,10 +1010,10 @@ void Hprof::DumpHeapClass(mirror::Class* klass, EndianOutput* output) {
       __ AddU1(t);
       switch (size) {
         case 1:
-          __ AddU1(static_cast<uint8_t>(f->Get32(klass)));
+          __ AddU1(f->GetByte(klass));
           break;
         case 2:
-          __ AddU2(static_cast<uint16_t>(f->Get32(klass)));
+          __ AddU2(f->GetChar(klass));
           break;
         case 4:
           __ AddU4(f->Get32(klass));
@@ -1101,9 +1101,9 @@ void Hprof::DumpHeapInstanceObject(mirror::Object* obj, mirror::Class* klass,
       size_t size;
       SignatureToBasicTypeAndSize(f->GetTypeDescriptor(), &size);
       if (size == 1) {
-        __ AddU1(f->Get32(obj));
+        __ AddU1(f->GetByte(obj));
       } else if (size == 2) {
-        __ AddU2(f->Get32(obj));
+        __ AddU2(f->GetChar(obj));
       } else if (size == 4) {
         __ AddU4(f->Get32(obj));
       } else {