From 2a73274266e9e1f5ec30ea9e62c96f6ed09c94ec Mon Sep 17 00:00:00 2001 From: caheckman <48068198+caheckman@users.noreply.github.com> Date: Tue, 12 Apr 2022 18:29:02 -0400 Subject: [PATCH 1/2] GP-1915 Don't register p-code injections when testing --- .../main/java/ghidra/program/database/SpecExtension.java | 8 +++++++- .../java/ghidra/program/model/lang/BasicCompilerSpec.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java index 0b2ee72704..01372bef38 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java @@ -637,7 +637,13 @@ public class SpecExtension { } cspecValidator.verify(res.optionName, document); checkExtension(res); - parseExtension(res.optionName, document, program.getCompilerSpec(), false); + if (!(program.getCompilerSpec() instanceof BasicCompilerSpec)) { + throw new SleighException( + "Can only test specification extensions against SLEIGH program"); + } + BasicCompilerSpec cSpecCopy = + new BasicCompilerSpec((BasicCompilerSpec) program.getCompilerSpec()); + parseExtension(res.optionName, document, cSpecCopy, false); return res; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java index 6f82352b27..56e457fddd 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java @@ -163,7 +163,7 @@ public class BasicCompilerSpec implements CompilerSpec { * spec from Language. * @param op2 is the spec to clone */ - protected BasicCompilerSpec(BasicCompilerSpec op2) { + public BasicCompilerSpec(BasicCompilerSpec op2) { language = op2.language; description = op2.description; // PrototypeModel is immutable but the map may change, so callingConventionMap From c5c74d987f55c9e456f14fecbd73949887fffd3c Mon Sep 17 00:00:00 2001 From: caheckman <48068198+caheckman@users.noreply.github.com> Date: Thu, 14 Apr 2022 19:19:48 -0400 Subject: [PATCH 2/2] GP-1924 Don't override previous dynamic mapping --- .../Decompiler/src/decompile/cpp/funcdata_varnode.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc index dad2994284..a710d25976 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc @@ -1177,11 +1177,10 @@ bool Funcdata::attemptDynamicMapping(SymbolEntry *entry,DynamicHash &dhash) dhash.clear(); Varnode *vn = dhash.findVarnode(this,entry->getFirstUseAddress(),entry->getHash()); if (vn == (Varnode *)0) return false; + if (vn->getSymbolEntry() != (SymbolEntry *)0) return false; // Varnode is already labeled if (entry->getSymbol()->getCategory() == 1) { // Is this an equate symbol - if (vn->mapentry != entry) { // Check we haven't marked this before - vn->setSymbolEntry(entry); - return true; - } + vn->setSymbolEntry(entry); + return true; } else if (entry->getSize() == vn->getSize()) { if (vn->setSymbolProperties(entry)) @@ -1205,7 +1204,7 @@ bool Funcdata::attemptDynamicMappingLate(SymbolEntry *entry,DynamicHash &dhash) Varnode *vn = dhash.findVarnode(this,entry->getFirstUseAddress(),entry->getHash()); if (vn == (Varnode *)0) return false; - if (vn->getSymbolEntry() == entry) return false; // Already applied it + if (vn->getSymbolEntry() != (SymbolEntry *)0) return false; // Symbol already applied Symbol *sym = entry->getSymbol(); if (sym->getCategory() == 1) { // Equate symbol does not depend on size vn->setSymbolEntry(entry);