aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <jesusfreke@jesusfreke.com>2015-03-03 18:08:44 -0800
committerBen Gruver <jesusfreke@jesusfreke.com>2015-03-03 18:08:44 -0800
commit6a56d9a9e993b051f9608dadda0022a1451d13e6 (patch)
treef4ec63018229a5d0fe0716ffbedfd1033827f113
parentea4074fdccb21ce6895e509523d05f7ce8906c59 (diff)
parent5dde46b43deef1f091a92b790a48f472866619f5 (diff)
downloadsmali-6a56d9a9e993b051f9608dadda0022a1451d13e6.tar.gz
Merge pull request #29 from yirkha/master
Fix for Dalvik VM crash on parameter annotations
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java18
1 files changed, 15 insertions, 3 deletions
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
index 87a2ae6b..268df9b1 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
@@ -576,6 +576,9 @@ public abstract class DexWriter<
private void writeAnnotationSets(@Nonnull DexDataWriter writer) throws IOException {
writer.align();
annotationSetSectionOffset = writer.getPosition();
+ if (shouldCreateEmptyAnnotationSet()) {
+ writer.writeInt(0);
+ }
for (Map.Entry<? extends AnnotationSetKey, Integer> entry: annotationSetSection.getItems()) {
Collection<? extends AnnotationKey> annotations = Ordering.from(BaseAnnotation.BY_TYPE)
.immutableSortedCopy(annotationSetSection.getAnnotations(entry.getKey()));
@@ -613,6 +616,8 @@ public abstract class DexWriter<
for (AnnotationSetKey annotationSetKey: parameterAnnotations) {
if (annotationSetSection.getAnnotations(annotationSetKey).size() > 0) {
writer.writeInt(annotationSetSection.getItemOffset(annotationSetKey));
+ } else if (shouldCreateEmptyAnnotationSet()) {
+ writer.writeInt(annotationSetSectionOffset);
} else {
writer.writeInt(NO_OFFSET);
}
@@ -1115,7 +1120,7 @@ public abstract class DexWriter<
if (annotationSection.getItems().size() > 0) {
numItems++;
}
- if (annotationSetSection.getItems().size() > 0) {
+ if (annotationSetSection.getItems().size() > 0 || shouldCreateEmptyAnnotationSet()) {
numItems++;
}
if (numAnnotationSetRefItems > 0) {
@@ -1163,8 +1168,8 @@ public abstract class DexWriter<
writeMapItem(writer, ItemType.TYPE_LIST, typeListSection.getItems().size(), typeListSectionOffset);
writeMapItem(writer, ItemType.ENCODED_ARRAY_ITEM, numEncodedArrayItems, encodedArraySectionOffset);
writeMapItem(writer, ItemType.ANNOTATION_ITEM, annotationSection.getItems().size(), annotationSectionOffset);
- writeMapItem(writer, ItemType.ANNOTATION_SET_ITEM, annotationSetSection.getItems().size(),
- annotationSetSectionOffset);
+ writeMapItem(writer, ItemType.ANNOTATION_SET_ITEM,
+ annotationSetSection.getItems().size() + (shouldCreateEmptyAnnotationSet() ? 1 : 0), annotationSetSectionOffset);
writeMapItem(writer, ItemType.ANNOTATION_SET_REF_LIST, numAnnotationSetRefItems, annotationSetRefSectionOffset);
writeMapItem(writer, ItemType.ANNOTATION_DIRECTORY_ITEM, numAnnotationDirectoryItems,
annotationDirectorySectionOffset);
@@ -1226,4 +1231,11 @@ public abstract class DexWriter<
writer.writeInt(0);
}
}
+
+ private boolean shouldCreateEmptyAnnotationSet() {
+ // Workaround for a crash in Dalvik VM before Jelly Bean MR1 (4.2)
+ // which is triggered by NO_OFFSET in parameter annotation list.
+ // (https://code.google.com/p/android/issues/detail?id=35304)
+ return (api < 17);
+ }
}