From f101e9a775608ee43cfa57821d91b8d895d043fe Mon Sep 17 00:00:00 2001 From: Wu Yongzheng Date: Thu, 21 Dec 2017 15:58:37 +0800 Subject: [PATCH 1/3] fix thread-safe bug Change HashMap to ConcurrentHashMap, because it can be used by many worker threads. --- jadx-core/src/main/java/jadx/api/JadxDecompiler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index 5382b02e0..b16481e8d 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -66,9 +66,9 @@ public final class JadxDecompiler { private BinaryXMLParser xmlParser; - private Map classesMap = new HashMap(); - private Map methodsMap = new HashMap(); - private Map fieldsMap = new HashMap(); + private Map classesMap = new java.util.concurrent.ConcurrentHashMap(); + private Map methodsMap = new java.util.concurrent.ConcurrentHashMap(); + private Map fieldsMap = new java.util.concurrent.ConcurrentHashMap(); public JadxDecompiler() { this(new JadxArgs()); From 0e2c4d4af167462b84eead36ad64b6142a34fecd Mon Sep 17 00:00:00 2001 From: Wu Yongzheng Date: Thu, 21 Dec 2017 16:00:11 +0800 Subject: [PATCH 2/3] fix thread-safe bug wrap WeakHashMap with Collections.synchronizedMap, because it can be used by many worker threads. --- jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java index 2f78059c8..674250fde 100644 --- a/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java +++ b/jadx-core/src/main/java/jadx/core/clsp/ClspGraph.java @@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory; public class ClspGraph { private static final Logger LOG = LoggerFactory.getLogger(ClspGraph.class); - private final Map> ancestorCache = new WeakHashMap>(); + private final Map> ancestorCache = Collections.synchronizedMap(new WeakHashMap>()); private Map nameMap; private final Set missingClasses = new HashSet(); From 233054219f4018e235e39faac56e7ae0067e0a36 Mon Sep 17 00:00:00 2001 From: Wu Yongzheng Date: Thu, 21 Dec 2017 16:04:12 +0800 Subject: [PATCH 3/3] fix issue #184 please refer to https://github.com/skylot/jadx/issues/184 --- jadx-core/src/main/java/jadx/core/utils/BlockUtils.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java index aecd7d51d..d5b5bafa8 100644 --- a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java @@ -453,15 +453,18 @@ public class BlockUtils { */ public static List collectBlocksDominatedBy(BlockNode dominator, BlockNode start) { List result = new ArrayList(); - collectWhileDominates(dominator, start, result); + HashSet visited = new HashSet(); + collectWhileDominates(dominator, start, result, visited); return result; } - private static void collectWhileDominates(BlockNode dominator, BlockNode child, List result) { + private static void collectWhileDominates(BlockNode dominator, BlockNode child, List result, HashSet visited) { + if (visited.contains(child)) return; + visited.add(child); for (BlockNode node : child.getCleanSuccessors()) { if (node.isDominator(dominator)) { result.add(node); - collectWhileDominates(dominator, node, result); + collectWhileDominates(dominator, node, result, visited); } } }