mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
Merge remote-tracking branch 'origin/GP-5749_ghidra1_SARIF_improvements' into Ghidra_11.4
This commit is contained in:
commit
4a65e9af3b
2 changed files with 53 additions and 47 deletions
|
@ -77,14 +77,16 @@ public class SarifClassesNamespaceWriter extends AbstractExtWriter {
|
||||||
objects.add(getTree(sarif));
|
objects.add(getTree(sarif));
|
||||||
|
|
||||||
SymbolIterator symbols = symbolTable.getSymbols(cls);
|
SymbolIterator symbols = symbolTable.getSymbols(cls);
|
||||||
while (symbols.hasNext()) {
|
if (cls.isExternal()) {
|
||||||
Symbol sym = symbols.next();
|
while (symbols.hasNext()) {
|
||||||
if (cls.isExternal()) {
|
Symbol sym = symbols.next();
|
||||||
ExternalLocation loc = externalManager.getExternalLocation(sym);
|
ExternalLocation loc = externalManager.getExternalLocation(sym);
|
||||||
ExtLibraryLocation obj = new ExtLibraryLocation(loc);
|
if (loc != null) {
|
||||||
SarifObject sarif2 = new SarifObject(ExternalLibSarifMgr.SUBKEY1, ExternalLibSarifMgr.KEY, getTree(obj),
|
ExtLibraryLocation obj = new ExtLibraryLocation(loc);
|
||||||
loc.getAddress(), loc.getAddress());
|
SarifObject sarif2 = new SarifObject(ExternalLibSarifMgr.SUBKEY1, ExternalLibSarifMgr.KEY, getTree(obj),
|
||||||
objects.add(getTree(sarif2));
|
loc.getAddress(), loc.getAddress());
|
||||||
|
objects.add(getTree(sarif2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,22 +54,10 @@ public class FunctionsSarifMgr extends SarifMgr {
|
||||||
FID_BOOKMARK_CATEGORY);
|
FID_BOOKMARK_CATEGORY);
|
||||||
|
|
||||||
private DtParser dtParser;
|
private DtParser dtParser;
|
||||||
private Library extenalNamespace;
|
private Library externalNamespace;
|
||||||
|
|
||||||
FunctionsSarifMgr(Program program, MessageLog log) {
|
FunctionsSarifMgr(Program program, MessageLog log) {
|
||||||
super(KEY, program, log);
|
super(KEY, program, log);
|
||||||
int txId = program.startTransaction("SARIF FunctionMgr");
|
|
||||||
try {
|
|
||||||
SymbolTable symbolTable = program.getSymbolTable();
|
|
||||||
Symbol extLib = symbolTable.getLibrarySymbol("<EXTERNAL>");
|
|
||||||
if (extLib == null) {
|
|
||||||
extenalNamespace = symbolTable.createExternalLibrary(Library.UNKNOWN, SourceType.IMPORTED);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.appendException(e);
|
|
||||||
} finally {
|
|
||||||
program.endTransaction(txId, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
@ -233,6 +221,24 @@ public class FunctionsSarifMgr extends SarifMgr {
|
||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Library getExternalNamespace(Program program, MessageLog log) {
|
||||||
|
if (externalNamespace == null) {
|
||||||
|
int txId = program.startTransaction("SARIF FunctionMgr");
|
||||||
|
try {
|
||||||
|
SymbolTable symbolTable = program.getSymbolTable();
|
||||||
|
Symbol extLib = symbolTable.getLibrarySymbol("<EXTERNAL>");
|
||||||
|
if (extLib == null) {
|
||||||
|
externalNamespace = symbolTable.createExternalLibrary(Library.UNKNOWN, SourceType.IMPORTED);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.appendException(e);
|
||||||
|
} finally {
|
||||||
|
program.endTransaction(txId, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return externalNamespace;
|
||||||
|
}
|
||||||
|
|
||||||
private void setName(Address entryPoint, Function func, String name, Map<String, Object> result) {
|
private void setName(Address entryPoint, Function func, String name, Map<String, Object> result) {
|
||||||
SymbolPath path = new SymbolPath(name);
|
SymbolPath path = new SymbolPath(name);
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
|
@ -248,33 +254,31 @@ public class FunctionsSarifMgr extends SarifMgr {
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol symbol = func.getSymbol();
|
Symbol symbol = func.getSymbol();
|
||||||
if (path != null) {
|
try {
|
||||||
try {
|
Namespace ns = NamespaceUtils.getFunctionNamespaceAt(program, path, entryPoint);
|
||||||
Namespace ns = NamespaceUtils.getFunctionNamespaceAt(program, path, entryPoint);
|
if (ns == null) {
|
||||||
if (ns == null) {
|
ns = program.getGlobalNamespace();
|
||||||
ns = program.getGlobalNamespace();
|
SymbolPath parent = path.getParent();
|
||||||
SymbolPath parent = path.getParent();
|
if (parent != null && !parent.getName().equals(ns.getName())) {
|
||||||
if (parent != null && !parent.getName().equals(ns.getName())) {
|
Boolean isClass = (Boolean) result.get("namespaceIsClass");
|
||||||
Boolean isClass = (Boolean) result.get("namespaceIsClass");
|
String source = (String) result.get("sourceType");
|
||||||
String source = (String) result.get("sourceType");
|
SourceType sourceType = source.equals("DEFAULT") ? SourceType.IMPORTED : getSourceType(source);
|
||||||
SourceType sourceType = source.equals("DEFAULT") ? SourceType.IMPORTED : getSourceType(source);
|
ns = walkNamespace(program.getGlobalNamespace(), parent.getPath() + "::", entryPoint,
|
||||||
ns = walkNamespace(program.getGlobalNamespace(), parent.getPath() + "::", entryPoint,
|
sourceType, isClass);
|
||||||
sourceType, isClass);
|
symbol.setNameAndNamespace(name, ns, getSourceType("DEFAULT"));
|
||||||
symbol.setNameAndNamespace(name, ns, getSourceType("DEFAULT"));
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (path != null && path.getName().contains(Library.UNKNOWN)) {
|
|
||||||
ns = extenalNamespace;
|
|
||||||
}
|
|
||||||
if (ns.getParentNamespace() == null) {
|
|
||||||
symbol.setName(name, getSourceType("DEFAULT"));
|
|
||||||
} else {
|
|
||||||
symbol.setNameAndNamespace(name, ns.getParentNamespace(), getSourceType("DEFAULT")); // symbol.getSource());
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// name may already be set if symbols were loaded...
|
|
||||||
}
|
}
|
||||||
|
if (path.getName().contains(Library.UNKNOWN)) {
|
||||||
|
ns = getExternalNamespace(program, log);
|
||||||
|
}
|
||||||
|
if (ns.getParentNamespace() == null) {
|
||||||
|
symbol.setName(name, getSourceType("DEFAULT"));
|
||||||
|
} else {
|
||||||
|
symbol.setNameAndNamespace(name, ns.getParentNamespace(), getSourceType("DEFAULT")); // symbol.getSource());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// name may already be set if symbols were loaded...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue