From d2e757ee44c6425bd801b6f76ff14537203281b9 Mon Sep 17 00:00:00 2001 From: Søren Gjesse Date: Mon, 14 Dec 2020 14:52:31 +0100 Subject: Check for extended frame type when updating StackTableOffset offset Fixes #350 --- src/main/javassist/bytecode/StackMapTable.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/main') diff --git a/src/main/javassist/bytecode/StackMapTable.java b/src/main/javassist/bytecode/StackMapTable.java index 81622200..62a6aca0 100644 --- a/src/main/javassist/bytecode/StackMapTable.java +++ b/src/main/javassist/bytecode/StackMapTable.java @@ -204,8 +204,11 @@ public class StackMapTable extends AttributeInfo { } else if (type < 128) pos = sameLocals(pos, type); - else if (type < 247) - throw new BadBytecode("bad frame_type in StackMapTable"); + else if (type < 247) { + throw new BadBytecode( + "bad frame_type " + type + " in StackMapTable (pos: " + + pos + ", frame no.:" + nth + ")"); + } else if (type == 247) // SAME_LOCALS_1_STACK_ITEM_EXTENDED pos = sameLocals(pos, type); else if (type < 251) { @@ -890,11 +893,12 @@ public class StackMapTable extends AttributeInfo { match = oldPos <= where && where < position; if (match) { + int current = info[pos] & 0xff; int newDelta = offsetDelta + gap; position += gap; if (newDelta < 64) info[pos] = (byte)(newDelta + base); - else if (offsetDelta < 64) { + else if (offsetDelta < 64 && current != entry) { byte[] newinfo = insertGap(info, pos, 2); newinfo[pos] = (byte)entry; ByteArray.write16bit(newDelta, newinfo, pos + 1); -- cgit v1.2.3