From d7cd52308e6120e6750c4f46d7357e8e5033619c Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 26 Nov 2013 17:34:52 -0800 Subject: [PATCH] Fix an issue with nop opcodes with a non-null second byte --- dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java | 5 ++++- .../instruction/DexBackedUnknownInstruction.java | 9 +++++++-- .../iface/instruction/formats/UnknownInstruction.java | 2 +- .../instruction/ImmutableUnknownInstruction.java | 6 +++--- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java index e52db0b4..d6e5532e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java @@ -69,7 +69,10 @@ public class Opcodes { case 0x300: return Opcode.ARRAY_PAYLOAD; default: - return opcodesByValue[opcodeValue]; + if (opcodeValue >= 0 && opcodeValue < opcodesByValue.length) { + return opcodesByValue[opcodeValue]; + } + return null; } } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java index 4ab892ee..08d5d507 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java @@ -43,7 +43,12 @@ public class DexBackedUnknownInstruction extends DexBackedInstruction implements super(dexFile, Opcode.NOP, instructionStart); } - @Override public short getOriginalOpcode() { - return (short)dexFile.readUbyte(instructionStart); + @Override public int getOriginalOpcode() { + int opcode = dexFile.readUbyte(instructionStart); + if (opcode == 0) { + opcode = dexFile.readUshort(instructionStart); + } + + return opcode; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java index f98f00a8..45975d9e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java @@ -32,5 +32,5 @@ package org.jf.dexlib2.iface.instruction.formats; public interface UnknownInstruction extends Instruction10x { - short getOriginalOpcode(); + int getOriginalOpcode(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java index f971775c..79798574 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java @@ -38,9 +38,9 @@ import org.jf.dexlib2.iface.instruction.formats.UnknownInstruction; public class ImmutableUnknownInstruction extends ImmutableInstruction implements UnknownInstruction { public static final Format FORMAT = Format.Format10x; - protected final short originalOpcode; + protected final int originalOpcode; - public ImmutableUnknownInstruction(short originalOpcode) { + public ImmutableUnknownInstruction(int originalOpcode) { super(Opcode.NOP); this.originalOpcode = originalOpcode; } @@ -53,5 +53,5 @@ public class ImmutableUnknownInstruction extends ImmutableInstruction implements } @Override public Format getFormat() { return FORMAT; } - @Override public short getOriginalOpcode() { return originalOpcode; } + @Override public int getOriginalOpcode() { return originalOpcode; } }