OSDN Git Service

Ignore invalid access flags.
authorElliott Hughes <enh@google.com>
Fri, 2 Aug 2013 22:41:00 +0000 (15:41 -0700)
committerJeff Hao <jeffhao@google.com>
Mon, 16 Sep 2013 21:07:27 +0000 (14:07 -0700)
Bug: 10134551
Change-Id: I9df8f7a2541e0c9bd2f9294a202fef2afce815f8

libdex/DexSwapVerify.cpp
vm/oo/Class.cpp
vm/oo/Object.h

index 6cc139d..ff47ab5 100644 (file)
@@ -912,8 +912,9 @@ static void* swapClassDefItem(const CheckState* state, void* ptr) {
     SWAP_OFFSET4(item->classDataOff);
 
     if ((item->accessFlags & ~ACC_CLASS_MASK) != 0) {
-        ALOGE("Bogus class access flags %x", item->accessFlags);
-        return NULL;
+        // The VM specification says that unknown flags should be ignored.
+        ALOGV("Bogus class access flags %x", item->accessFlags);
+        item->accessFlags &= ACC_CLASS_MASK;
     }
 
     return item + 1;
@@ -1457,8 +1458,9 @@ static bool verifyFields(const CheckState* state, u4 size,
         }
 
         if ((accessFlags & ~ACC_FIELD_MASK) != 0) {
-            ALOGE("Bogus field access flags %x @ %d", accessFlags, i);
-            return false;
+            // The VM specification says that unknown flags should be ignored.
+            ALOGV("Bogus field access flags %x @ %d", accessFlags, i);
+            field->accessFlags &= ACC_FIELD_MASK;
         }
     }
 
@@ -1487,12 +1489,17 @@ static bool verifyMethods(const CheckState* state, u4 size,
             return false;
         }
 
-        if (((accessFlags & ~ACC_METHOD_MASK) != 0)
-                || (isSynchronized && !allowSynchronized)) {
-            ALOGE("Bogus method access flags %x @ %d", accessFlags, i);
+        if (isSynchronized && !allowSynchronized) {
+            ALOGE("Bogus method access flags (synchronization) %x @ %d", accessFlags, i);
             return false;
         }
 
+        if ((accessFlags & ~ACC_METHOD_MASK) != 0) {
+            // The VM specification says that unknown flags should be ignored.
+            ALOGV("Bogus method access flags %x @ %d", accessFlags, i);
+            method->accessFlags &= ACC_METHOD_MASK;
+        }
+
         if (expectCode) {
             if (method->codeOff == 0) {
                 ALOGE("Unexpected zero code_off for access_flags %x",
index 78a2273..db5340e 100644 (file)
@@ -1740,6 +1740,9 @@ static ClassObject* loadClassFromDex0(DvmDex* pDvmDex,
      * Make sure the aren't any "bonus" flags set, since we use them for
      * runtime state.
      */
+    /* bits we can reasonably expect to see set in a DEX access flags field */
+    const uint32_t EXPECTED_FILE_FLAGS = (ACC_CLASS_MASK | CLASS_ISPREVERIFIED |
+                                          CLASS_ISOPTIMIZED);
     if ((pClassDef->accessFlags & ~EXPECTED_FILE_FLAGS) != 0) {
         ALOGW("Invalid file flags in class %s: %04x",
             descriptor, pClassDef->accessFlags);
index ca41157..92438ba 100644 (file)
@@ -82,10 +82,6 @@ enum ClassFlags {
     CLASS_ISPREVERIFIED        = (1<<16), // class has been pre-verified
 };
 
-/* bits we can reasonably expect to see set in a DEX access flags field */
-#define EXPECTED_FILE_FLAGS \
-    (ACC_CLASS_MASK | CLASS_ISPREVERIFIED | CLASS_ISOPTIMIZED)
-
 /*
  * Get/set class flags.
  */