From 52fd17a43628cea6b86ca53115bd2aa2e6f6cd4c Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Wed, 26 Aug 2015 13:34:36 -0700 Subject: [PATCH] Handle invalid debug item offsets more gracefully --- .../dexbacked/DexBackedMethodImplementation.java | 11 ++++++++++- .../java/org/jf/dexlib2/dexbacked/raw/CodeItem.java | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java index 0c06b1d7..676d86cd 100644 --- a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -123,7 +123,16 @@ public class DexBackedMethodImplementation implements MethodImplementation { @Nonnull private DebugInfo getDebugInfo() { - return DebugInfo.newOrEmpty(dexFile, dexFile.readSmallUint(codeOffset + CodeItem.DEBUG_INFO_OFFSET), this); + int debugOffset = dexFile.readInt(codeOffset + CodeItem.DEBUG_INFO_OFFSET); + + if (debugOffset == -1 || debugOffset == 0) { + return DebugInfo.newOrEmpty(dexFile, 0, this); + } + if (debugOffset < 0) { + System.err.println("%s: Invalid debug offset"); + return DebugInfo.newOrEmpty(dexFile, 0, this); + } + return DebugInfo.newOrEmpty(dexFile, debugOffset, this); } @Nonnull @Override diff --git a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java index 9c79e270..27d72ad1 100644 --- a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java +++ b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java @@ -100,10 +100,10 @@ public class CodeItem { int triesCount = reader.readUshort(); out.annotate(2, "tries_size = %d", triesCount); - int debugInfoOffset = reader.readSmallUint(); + int debugInfoOffset = reader.readInt(); out.annotate(4, "debug_info_off = 0x%x", debugInfoOffset); - if (debugInfoOffset != 0) { + if (debugInfoOffset > 0) { addDebugInfoIdentity(debugInfoOffset, itemIdentity); }