diff --git a/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java b/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java index a9290b1c..9b12895d 100644 --- a/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/FieldIdItem.java @@ -117,8 +117,20 @@ public class FieldIdItem extends Item { out.annotate(4, "field_name: " + fieldName.getStringValue()); } - out.writeShort(classType.getIndex()); - out.writeShort(fieldType.getIndex()); + int classIndex = classType.getIndex(); + if (classIndex > 0xffff) { + throw new RuntimeException(String.format("Error writing field_id_item for %s. The type index of " + + "defining class %s is too large", getFieldString(), classType.getTypeDescriptor())); + } + out.writeShort(classIndex); + + int typeIndex = fieldType.getIndex(); + if (typeIndex > 0xffff) { + throw new RuntimeException(String.format("Error writing field_id_item for %s. The type index of field " + + "type %s is too large", getFieldString(), fieldType.getTypeDescriptor())); + } + out.writeShort(typeIndex); + out.writeInt(fieldName.getIndex()); } diff --git a/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java b/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java index 0c6f5210..0ec962a8 100644 --- a/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/MethodIdItem.java @@ -112,8 +112,20 @@ public class MethodIdItem extends Item { out.annotate(4, "method_name: " + methodName.getStringValue()); } - out.writeShort(classType.getIndex()); - out.writeShort(methodPrototype.getIndex()); + int classIndex = classType.getIndex(); + if (classIndex > 0xffff) { + throw new RuntimeException(String.format("Error writing method_id_item for %s. The type index of " + + "defining class %s is too large", getMethodString(), classType.getTypeDescriptor())); + } + out.writeShort(classIndex); + + int prototypeIndex = methodPrototype.getIndex(); + if (prototypeIndex > 0xffff) { + throw new RuntimeException(String.format("Error writing method_id_item for %0. The prototype index of " + + "method prototype %s is too large", getMethodString(), methodPrototype.getPrototypeString())); + } + out.writeShort(prototypeIndex); + out.writeInt(methodName.getIndex()); } diff --git a/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java b/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java index 34053bbb..50262ea1 100644 --- a/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/TypeListItem.java @@ -116,7 +116,12 @@ public class TypeListItem extends Item { } out.writeInt(typeList.length); for (TypeIdItem typeIdItem: typeList) { - out.writeShort(typeIdItem.getIndex()); + int typeIndex = typeIdItem.getIndex(); + if (typeIndex > 0xffff) { + throw new RuntimeException(String.format("Error writing type_list entry. The type index of " + + "type %s is too large", typeIdItem.getTypeDescriptor())); + } + out.writeShort(typeIndex); } }