mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-25 16:08:18 +02:00
FpDebug: Avoid crash on invalid CFI-information
This commit is contained in:
parent
563d7e2d6f
commit
07cba653fa
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user