GP-5321: Fixing PE debug coff symbol NPE

This commit is contained in:
Ryan Kurtz 2025-01-29 06:00:09 -05:00
parent a6809a3529
commit 5452e14db4
2 changed files with 25 additions and 27 deletions

View file

@ -16,6 +16,8 @@
package ghidra.app.util.bin.format.pe.debug; package ghidra.app.util.bin.format.pe.debug;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ghidra.app.util.bin.BinaryReader; import ghidra.app.util.bin.BinaryReader;
import ghidra.app.util.bin.format.pe.NTHeader; import ghidra.app.util.bin.format.pe.NTHeader;
@ -27,21 +29,19 @@ public class DebugCOFFSymbolTable {
private int ptrToSymbolTable; private int ptrToSymbolTable;
private int symbolCount; private int symbolCount;
private DebugCOFFSymbol [] symbols; private List<DebugCOFFSymbol> symbols = new ArrayList<>();
public DebugCOFFSymbolTable(BinaryReader reader, DebugCOFFSymbolsHeader coffHeader, int offset) public DebugCOFFSymbolTable(BinaryReader reader, DebugCOFFSymbolsHeader coffHeader, int offset)
throws IOException { throws IOException {
this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset; this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset;
this.symbolCount = coffHeader.getNumberOfSymbols(); this.symbolCount = coffHeader.getNumberOfSymbols();
//TODO: //TODO: should symbol table info in NT Header agree with info in COFF Header?
//should symbol table info in NT Header agree with info in COFF Header?
if (symbolCount > 0 && symbolCount < NTHeader.MAX_SANE_COUNT) { if (symbolCount < NTHeader.MAX_SANE_COUNT) {
symbols = new DebugCOFFSymbol[symbolCount];
for (int i = 0; i < symbolCount; ++i) { for (int i = 0; i < symbolCount; ++i) {
symbols[i] = new DebugCOFFSymbol(reader, symbols.add(new DebugCOFFSymbol(reader,
ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this); ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this));
} }
} }
} }
@ -51,10 +51,9 @@ public class DebugCOFFSymbolTable {
} }
/** /**
* Returns the COFF symbols defined in this COFF symbol table. * {@return the COFF symbols defined in this COFF symbol table}
* @return the COFF symbols defined in this COFF symbol table
*/ */
public DebugCOFFSymbol [] getSymbols() { public List<DebugCOFFSymbol> getSymbols() {
return symbols; return symbols;
} }
} }

View file

@ -345,9 +345,8 @@ abstract class AbstractPeDebugLoader extends AbstractOrdinalSupportLoader {
if (dcst == null) { if (dcst == null) {
return; return;
} }
DebugCOFFSymbol[] symbols = dcst.getSymbols();
int errorCount = 0; int errorCount = 0;
for (DebugCOFFSymbol symbol : symbols) { for (DebugCOFFSymbol symbol : dcst.getSymbols()) {
if (monitor.isCancelled()) { if (monitor.isCancelled()) {
return; return;
} }