aboutsummaryrefslogtreecommitdiff
path: root/libdex
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-08-02 15:41:00 -0700
committerJeff Hao <jeffhao@google.com>2013-09-16 14:07:27 -0700
commit4b44ea2e3a8f5d5f30926095b0e5d803d406fbef (patch)
tree3d328d61ae3e125e117e9bdba7b93890ae170f92 /libdex
parent7c5e6a3268dc25207633ce1ff5958ce705aba77a (diff)
Ignore invalid access flags.
Bug: 10134551 Change-Id: I9df8f7a2541e0c9bd2f9294a202fef2afce815f8
Diffstat (limited to 'libdex')
-rw-r--r--libdex/DexSwapVerify.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/libdex/DexSwapVerify.cpp b/libdex/DexSwapVerify.cpp
index 6cc139dcf..ff47ab5d1 100644
--- a/libdex/DexSwapVerify.cpp
+++ b/libdex/DexSwapVerify.cpp
@@ -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",