FpDebug: Avoid crash on invalid CFI-information

This commit is contained in:
Joost van der Sluis 2022-06-29 10:02:52 +02:00
parent 563d7e2d6f
commit 07cba653fa

View File

@ -3949,8 +3949,9 @@ var
if CIE.SegmentSize > 0 then if CIE.SegmentSize > 0 then
SegmentSelector := ReadUnsignedFromExpression(p, CIE.SegmentSize); SegmentSelector := ReadUnsignedFromExpression(p, CIE.SegmentSize);
InitialLocation := ReadUnsignedFromExpression(p, CIE.AddressSize); InitialLocation := ReadUnsignedFromExpression(p, CIE.AddressSize);
if InitialLocation > 0 then
begin
AddressRange := ReadUnsignedFromExpression(p, CIE.AddressSize); AddressRange := ReadUnsignedFromExpression(p, CIE.AddressSize);
end;
Result := TDwarfFDE.Create(CIEPointer, InitialLocation, SegmentSelector, AddressRange); Result := TDwarfFDE.Create(CIEPointer, InitialLocation, SegmentSelector, AddressRange);
@ -3958,6 +3959,18 @@ var
if Length(Instr) > 0 then if Length(Instr) > 0 then
Move(p^, Instr[0], InitialLocationAddr + SizeLeft - p); Move(p^, Instr[0], InitialLocationAddr + SizeLeft - p);
Result.Instructions := Instr; Result.Instructions := Instr;
end
else
begin
DebugLn(FPDBG_DWARF_WARNINGS, ['Read FDE but it''s initial location is 0. Skipped.']);
Result := nil;
end;
end
else
begin
DebugLn(FPDBG_DWARF_WARNINGS, ['Read FDE but could not locate the corresponding CIE ['+HexStr(CIEPointer, 8)+'].']);
Result := nil;
end;
end; end;
var var
@ -3999,6 +4012,7 @@ begin
begin begin
// It is a FDE // It is a FDE
FDE := LoadFDE(CFI, FDE64^.CIEPointer, @FDE64^.InitialLocation, @FDE64^.CIEPointer+FDE64^.Length-@FDE64^.InitialLocation); FDE := LoadFDE(CFI, FDE64^.CIEPointer, @FDE64^.InitialLocation, @FDE64^.CIEPointer+FDE64^.Length-@FDE64^.InitialLocation);
if Assigned(FDE) then
CFI.AddFDE(FDE); CFI.AddFDE(FDE);
end; end;
Length := CIE64^.Length; Length := CIE64^.Length;
@ -4019,6 +4033,7 @@ begin
if FDE32^.Length > 0 then if FDE32^.Length > 0 then
begin begin
FDE := LoadFDE(CFI, FDE32^.CIEPointer, @FDE32^.InitialLocation, @FDE32^.CIEPointer+FDE32^.Length-@FDE32^.InitialLocation); FDE := LoadFDE(CFI, FDE32^.CIEPointer, @FDE32^.InitialLocation, @FDE32^.CIEPointer+FDE32^.Length-@FDE32^.InitialLocation);
if Assigned(FDE) then
CFI.AddFDE(FDE); CFI.AddFDE(FDE);
end end
else else