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

@ -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.
@ -16,6 +16,8 @@
package ghidra.app.util.bin.format.pe.debug;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ghidra.app.util.bin.BinaryReader;
import ghidra.app.util.bin.format.pe.NTHeader;
@ -24,37 +26,34 @@ import ghidra.app.util.bin.format.pe.NTHeader;
* A class to represent the COFF Symbol Table.
*/
public class DebugCOFFSymbolTable {
private int ptrToSymbolTable;
private int symbolCount;
private int ptrToSymbolTable;
private int symbolCount;
private DebugCOFFSymbol [] symbols;
private List<DebugCOFFSymbol> symbols = new ArrayList<>();
public DebugCOFFSymbolTable(BinaryReader reader, DebugCOFFSymbolsHeader coffHeader, int offset)
throws IOException {
this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset;
this.symbolCount = coffHeader.getNumberOfSymbols();
this.ptrToSymbolTable = coffHeader.getFirstSymbolLVA() + offset;
this.symbolCount = coffHeader.getNumberOfSymbols();
//TODO:
//should symbol table info in NT Header agree with info in COFF Header?
//TODO: should symbol table info in NT Header agree with info in COFF Header?
if (symbolCount > 0 && symbolCount < NTHeader.MAX_SANE_COUNT) {
symbols = new DebugCOFFSymbol[symbolCount];
for (int i = 0 ; i < symbolCount ; ++i) {
symbols[i] = new DebugCOFFSymbol(reader,
ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this);
}
}
}
if (symbolCount < NTHeader.MAX_SANE_COUNT) {
for (int i = 0; i < symbolCount; ++i) {
symbols.add(new DebugCOFFSymbol(reader,
ptrToSymbolTable + (i * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL), this));
}
}
}
int getStringTableIndex() {
return ptrToSymbolTable + (symbolCount * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL);
}
int getStringTableIndex() {
return ptrToSymbolTable + (symbolCount * DebugCOFFSymbol.IMAGE_SIZEOF_SYMBOL);
}
/**
* 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() {
return symbols;
}
public List<DebugCOFFSymbol> getSymbols() {
return symbols;
}
}

View file

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