From d95e9e35d7c2397756a646cbf1dbf72bcf641575 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:59:27 +0000 Subject: [PATCH] GP-6295: Fix ReDisassembler: MemBuffer address, avoid equiv prototype replacement. --- .../ghidra/program/disassemble/ReDisassembler.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java index d30d887919..75ea601050 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java @@ -86,7 +86,7 @@ public class ReDisassembler { protected class ReDisState { protected final TaskMonitor monitor; - protected final Map progMemBuffers = new HashMap<>(); + protected final Map progMemBuffers = new HashMap<>(); protected final ProgramContext tempContext = new ProgramContextImpl(language); protected final AddressSet visited = new AddressSet(); protected final Deque queue = new LinkedList<>(); @@ -121,9 +121,10 @@ public class ReDisassembler { } protected MemBuffer createBuffer(Address at) { - return progMemBuffers.computeIfAbsent(at.getAddressSpace(), space -> { - return new DumbMemBufferImpl(program.getMemory(), space.getMinAddress()); - }); + DumbMemBufferImpl buffer = progMemBuffers.computeIfAbsent(at.getAddressSpace(), + space -> new DumbMemBufferImpl(program.getMemory(), space.getMinAddress())); + buffer.setPosition(at); + return buffer; } /** @@ -253,6 +254,11 @@ public class ReDisassembler { ReDisassemblerContext ctx = new ReDisassemblerContext(state, flow); try { InstructionPrototype prototype = language.parse(buffer, ctx, false); + Instruction exists = program.getListing().getInstructionAt(flow.to); + if (exists != null && exists.getPrototype().equals(prototype) && + flow.type != FlowType.SEED) { + return null; + } return createInstruction(flow.to, prototype, buffer, ctx); } catch (UnknownInstructionException e) {