Commit 45f5e0cb authored by Skylot's avatar Skylot

core: prevent endless loop in region construction (#267)

parent 7d983f28
...@@ -44,6 +44,7 @@ import jadx.core.utils.ErrorsCounter; ...@@ -44,6 +44,7 @@ import jadx.core.utils.ErrorsCounter;
import jadx.core.utils.InstructionRemover; import jadx.core.utils.InstructionRemover;
import jadx.core.utils.RegionUtils; import jadx.core.utils.RegionUtils;
import jadx.core.utils.exceptions.JadxOverflowException; import jadx.core.utils.exceptions.JadxOverflowException;
import jadx.core.utils.exceptions.JadxRuntimeException;
import static jadx.core.dex.visitors.regions.IfMakerHelper.confirmMerge; import static jadx.core.dex.visitors.regions.IfMakerHelper.confirmMerge;
import static jadx.core.dex.visitors.regions.IfMakerHelper.makeIfInfo; import static jadx.core.dex.visitors.regions.IfMakerHelper.makeIfInfo;
...@@ -60,34 +61,21 @@ public class RegionMaker { ...@@ -60,34 +61,21 @@ public class RegionMaker {
private static final int REGIONS_LIMIT = 1000 * 1000; private static final int REGIONS_LIMIT = 1000 * 1000;
private final MethodNode mth; private final MethodNode mth;
private BitSet processedBlocks;
private int regionsCount; private int regionsCount;
public RegionMaker(MethodNode mth) { public RegionMaker(MethodNode mth) {
this.mth = mth; this.mth = mth;
if (Consts.DEBUG) {
this.processedBlocks = new BitSet(mth.getBasicBlocks().size());
}
} }
public Region makeRegion(BlockNode startBlock, RegionStack stack) { public Region makeRegion(BlockNode startBlock, RegionStack stack) {
if (Consts.DEBUG) {
int id = startBlock.getId();
if (processedBlocks.get(id)) {
LOG.debug(" Block already processed: {}, mth: {}", startBlock, mth);
} else {
processedBlocks.set(id);
}
}
regionsCount++;
if (regionsCount > REGIONS_LIMIT) {
throw new JadxOverflowException("Regions count limit reached");
}
Region r = new Region(stack.peekRegion()); Region r = new Region(stack.peekRegion());
BlockNode next = startBlock; BlockNode next = startBlock;
while (next != null) { while (next != null) {
next = traverse(r, next, stack); next = traverse(r, next, stack);
regionsCount++;
if (regionsCount > REGIONS_LIMIT) {
throw new JadxRuntimeException("Regions count limit reached");
}
} }
return r; return r;
} }
......
...@@ -45,7 +45,7 @@ public class DebugUtils { ...@@ -45,7 +45,7 @@ public class DebugUtils {
} }
public static void dump(MethodNode mth, String desc) { public static void dump(MethodNode mth, String desc) {
File out = new File("test-graph" + desc + "-tmp"); File out = new File("test-graph-" + desc + "-tmp");
DotGraphVisitor.dump().save(out, mth); DotGraphVisitor.dump().save(out, mth);
DotGraphVisitor.dumpRaw().save(out, mth); DotGraphVisitor.dumpRaw().save(out, mth);
DotGraphVisitor.dumpRegions().save(out, mth); DotGraphVisitor.dumpRegions().save(out, mth);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment