From 535645f6a75943d27cdfca5a1d537ebc2c630a15 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:14:41 -0400 Subject: [PATCH] GP-4696 Clear data from a clearflow and repair, only if the information there could have been created from simple disassembly --- .../plugin/core/clear/ClearFlowAndRepairCmd.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowAndRepairCmd.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowAndRepairCmd.java index c44d032b3c..8cc840ba4b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowAndRepairCmd.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowAndRepairCmd.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -26,6 +26,7 @@ import ghidra.program.disassemble.Disassembler; import ghidra.program.disassemble.DisassemblerContextImpl; import ghidra.program.model.address.*; import ghidra.program.model.block.*; +import ghidra.program.model.data.Undefined; import ghidra.program.model.lang.Register; import ghidra.program.model.lang.RegisterValue; import ghidra.program.model.listing.*; @@ -308,8 +309,17 @@ public class ClearFlowAndRepairCmd extends BackgroundCommand { } // no instruction, check if data is there Data data = listing.getDefinedDataAt(toAddr); + // data or instruction not found at destination if (data == null) { - continue; // instruction not found at destination + continue; // don't add to clear set + } + // has an external reference from data, not produced from bad flow + if (data.getExternalReference(0) != null) { + continue; // don't add to clear set + } + // if defined data is anything other than Undefined1,2... or a pointer + if (data.isDefined() && !(data.getDataType() instanceof Undefined) && !(data.isPointer())) { + continue; // don't add to clear set } } boolean clearIt = true;