aboutsummaryrefslogtreecommitdiff
path: root/dexlib2/src
diff options
context:
space:
mode:
authorJiri Hruska <jirka@fud.cz>2015-02-19 02:59:41 +0100
committerJiri Hruska <jirka@fud.cz>2015-02-19 02:59:41 +0100
commit5dde46b43deef1f091a92b790a48f472866619f5 (patch)
treedd82fde60f6a9535b51c3624f75b9d234acaf2d4 /dexlib2/src
parent0f8017e16a38cec81232b34faf89c7eb1502c59c (diff)
downloadsmali-5dde46b43deef1f091a92b790a48f472866619f5.tar.gz
Fix for Dalvik VM crash on parameter annotations
Dalvik VM before Jelly Bean MR1 (4.2) crashes if there are any NO_OFFSET (0) values in parameter annotation list. (https://code.google.com/p/android/issues/detail?id=35304)
Diffstat (limited to 'dexlib2/src')
-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);
+ }
}