From e3e56fa29cf80637fb09dc2d8858efbaec53eb2b Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Wed, 29 Jan 2020 11:30:30 -0500 Subject: [PATCH] GT-3511 corrected infinite loop is disassembler caused by branch to self with nested delay slot failure --- .../program/disassemble/DisassemblerQueue.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/DisassemblerQueue.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/DisassemblerQueue.java index 95201b41cc..2159d7313e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/DisassemblerQueue.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/DisassemblerQueue.java @@ -79,8 +79,8 @@ class DisassemblerQueue { currentBranchQueue = new TreeSet(ORDERED_FLOW_COMPARATOR); processedBranchFlows = new HashSet(48); - orderedSeedQueue.add(new InstructionBlockFlow(startAddr, null, - InstructionBlockFlow.Type.PRIORITY)); + orderedSeedQueue.add( + new InstructionBlockFlow(startAddr, null, InstructionBlockFlow.Type.PRIORITY)); } /** @@ -174,6 +174,9 @@ class DisassemblerQueue { branchFlow = currentBranchQueue.first(); currentBranchQueue.remove(branchFlow); } + if (processedBranchFlows.contains(branchFlow)) { + continue; + } processedBranchFlows.add(branchFlow); Address blockAddr = branchFlow.getDestinationAddress(); @@ -202,7 +205,7 @@ class DisassemblerQueue { DisassemblerConflictHandler conflictHandler) { int disassembleCount = 0; - + AddressSet conflictAddrs = new AddressSet(); // check for disassembly errors and deferred call queuing @@ -232,8 +235,8 @@ class DisassemblerQueue { if (flowType != Type.CALL && processedBranchFlows.contains(blockFlow)) { continue; } - if (conflict == null || - conflict.getInstructionAddress().compareTo(blockFlow.getFlowFromAddress()) > 0) { + if (conflict == null || conflict.getInstructionAddress().compareTo( + blockFlow.getFlowFromAddress()) > 0) { // Add good flows to priorityBranchSet to ensure that future context is // properly consumed with a guaranteed block start. We don't // want block to be dependent upon a parent block