mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Fix cyclic x64 unwind chain parsing
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
package ghidra.app.util.bin.format.pe;
|
package ghidra.app.util.bin.format.pe;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import ghidra.app.util.bin.BinaryReader;
|
import ghidra.app.util.bin.BinaryReader;
|
||||||
import ghidra.app.util.bin.StructConverter;
|
import ghidra.app.util.bin.StructConverter;
|
||||||
@@ -158,6 +160,15 @@ class PEx64UnwindInfo implements StructConverter {
|
|||||||
|
|
||||||
static PEx64UnwindInfo readUnwindInfo(BinaryReader reader, long offset, NTHeader ntHeader)
|
static PEx64UnwindInfo readUnwindInfo(BinaryReader reader, long offset, NTHeader ntHeader)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
return readUnwindInfo(reader, offset, ntHeader, new HashSet<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PEx64UnwindInfo readUnwindInfo(BinaryReader reader, long offset,
|
||||||
|
NTHeader ntHeader, Set<Long> visitedOffsets) throws IOException {
|
||||||
|
if (!visitedOffsets.add(offset)) {
|
||||||
|
throw new IOException("Cyclic unwind info chain");
|
||||||
|
}
|
||||||
|
|
||||||
long origIndex = reader.getPointerIndex();
|
long origIndex = reader.getPointerIndex();
|
||||||
|
|
||||||
long pointer = ntHeader.rvaToPointer(offset);
|
long pointer = ntHeader.rvaToPointer(offset);
|
||||||
@@ -205,7 +216,8 @@ class PEx64UnwindInfo implements StructConverter {
|
|||||||
|
|
||||||
// Follow the chain to the referenced UNWIND_INFO structure until we
|
// Follow the chain to the referenced UNWIND_INFO structure until we
|
||||||
// get to the end
|
// get to the end
|
||||||
PEx64UnwindInfo info = readUnwindInfo(reader, unwindInfoAddressOrData, ntHeader);
|
PEx64UnwindInfo info =
|
||||||
|
readUnwindInfo(reader, unwindInfoAddressOrData, ntHeader, visitedOffsets);
|
||||||
unwindInfo.unwindHandlerChainInfo = new ImageRuntimeFunctionEntry_X86(beginAddress,
|
unwindInfo.unwindHandlerChainInfo = new ImageRuntimeFunctionEntry_X86(beginAddress,
|
||||||
endAddress, unwindInfoAddressOrData, info);
|
endAddress, unwindInfoAddressOrData, info);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user