From f3d76c433a9fa94b14663454eab3a8b27a15961d Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 18 Jun 2021 17:34:21 +0100 Subject: [PATCH] fix: prevent StackOverflowError in MarkFinallyVisitor (#1191) --- .../core/dex/visitors/MarkFinallyVisitor.java | 4 +- .../trycatch/TestTryCatchFinally11.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally11.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/MarkFinallyVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/MarkFinallyVisitor.java index df94b494d..f264581b5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/MarkFinallyVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/MarkFinallyVisitor.java @@ -398,8 +398,8 @@ public class MarkFinallyVisitor extends AbstractVisitor { InsnsSlice dupSlice, FinallyExtractInfo extractInfo) { InsnsSlice finallySlice = extractInfo.getFinallyInsnsSlice(); - List finallyCS = finallyBlock.getSuccessors(); - List dupCS = dupBlock.getSuccessors(); + List finallyCS = finallyBlock.getCleanSuccessors(); + List dupCS = dupBlock.getCleanSuccessors(); if (finallyCS.size() == dupCS.size()) { for (int i = 0; i < finallyCS.size(); i++) { BlockNode finSBlock = finallyCS.get(i); diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally11.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally11.java new file mode 100644 index 000000000..3e063ca94 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally11.java @@ -0,0 +1,48 @@ +package jadx.tests.integration.trycatch; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestTryCatchFinally11 extends IntegrationTest { + + public static class TestCls { + private int count = 0; + + public void test(List list) { + try { + call1(); + } finally { + for (Object item : list) { + call2(item); + } + } + } + + private void call1() { + count += 100; + } + + private void call2(Object item) { + count++; + } + + public void check() { + TestCls t = new TestCls(); + t.test(Arrays.asList("1", "2")); + assertThat(t.count).isEqualTo(102); + } + } + + @Test + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("} finally {"); + } +}