GP-0 corrected SymbolManager treatment of deleted namespace

This commit is contained in:
ghidra1 2021-12-14 21:25:05 -05:00
parent 625e4bd9eb
commit 2fb58060b7

View file

@ -884,6 +884,9 @@ public class SymbolManager implements SymbolTable, ManagerDB {
namespace = program.getGlobalNamespace(); namespace = program.getGlobalNamespace();
} }
if (isDeletedNamespace(namespace)) {
return null;
}
checkValidNamespaceArgument(namespace); checkValidNamespaceArgument(namespace);
long namespaceId = namespace.getID(); long namespaceId = namespace.getID();
@ -968,6 +971,10 @@ public class SymbolManager implements SymbolTable, ManagerDB {
namespace = namespaceMgr.getGlobalNamespace(); namespace = namespaceMgr.getGlobalNamespace();
} }
List<Symbol> list = new ArrayList<>();
if (isDeletedNamespace(namespace)) {
return list;
}
checkValidNamespaceArgument(namespace); checkValidNamespaceArgument(namespace);
// if name is possible default parameter or local variable name, must do brute force search // if name is possible default parameter or local variable name, must do brute force search
@ -981,7 +988,6 @@ public class SymbolManager implements SymbolTable, ManagerDB {
return searchNamespaceForSymbols(name, namespace); return searchNamespaceForSymbols(name, namespace);
} }
List<Symbol> list = new ArrayList<>();
lock.acquire(); lock.acquire();
try { try {
RecordIterator it = adapter.getSymbolsByNameAndNamespace(name, namespace.getID()); RecordIterator it = adapter.getSymbolsByNameAndNamespace(name, namespace.getID());
@ -1044,6 +1050,9 @@ public class SymbolManager implements SymbolTable, ManagerDB {
namespace = namespaceMgr.getGlobalNamespace(); namespace = namespaceMgr.getGlobalNamespace();
} }
if (isDeletedNamespace(namespace)) {
return null;
}
checkValidNamespaceArgument(namespace); checkValidNamespaceArgument(namespace);
// if name is possible default parameter or local variable name, must do brute force search // if name is possible default parameter or local variable name, must do brute force search
@ -1096,6 +1105,9 @@ public class SymbolManager implements SymbolTable, ManagerDB {
@Override @Override
public SymbolIterator getSymbols(Namespace namespace) { public SymbolIterator getSymbols(Namespace namespace) {
if (isDeletedNamespace(namespace)) {
return SymbolIterator.EMPTY_ITERATOR;
}
checkValidNamespaceArgument(namespace); checkValidNamespaceArgument(namespace);
return getSymbols(namespace.getID()); return getSymbols(namespace.getID());
} }
@ -3065,4 +3077,9 @@ public class SymbolManager implements SymbolTable, ManagerDB {
return newNamespaceSymbol != null && !newNamespaceSymbol.isDeleted() && return newNamespaceSymbol != null && !newNamespaceSymbol.isDeleted() &&
(newNamespaceSymbol.getProgram() == getProgram()); (newNamespaceSymbol.getProgram() == getProgram());
} }
boolean isDeletedNamespace(Namespace namespace) {
Symbol newNamespaceSymbol = namespace.getSymbol();
return (newNamespaceSymbol == null) || newNamespaceSymbol.isDeleted();
}
} }