diff options
| author | Elliott Hughes <enh@google.com> | 2013-08-02 15:41:00 -0700 |
|---|---|---|
| committer | Jeff Hao <jeffhao@google.com> | 2013-09-16 14:07:27 -0700 |
| commit | 4b44ea2e3a8f5d5f30926095b0e5d803d406fbef (patch) | |
| tree | 3d328d61ae3e125e117e9bdba7b93890ae170f92 /libdex | |
| parent | 7c5e6a3268dc25207633ce1ff5958ce705aba77a (diff) | |
Ignore invalid access flags.
Bug: 10134551
Change-Id: I9df8f7a2541e0c9bd2f9294a202fef2afce815f8
Diffstat (limited to 'libdex')
| -rw-r--r-- | libdex/DexSwapVerify.cpp | 21 |
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", |
