FIX: Range check error (fixes #2338)

This commit is contained in:
Alexander Koblov 2025-06-04 20:02:54 +03:00
commit 3c9894fca3

View file

@ -499,6 +499,43 @@ end;
{$IF DEFINED(UNIX)}
procedure NormalizeFileTime(var UnixTime: DCBasicTypes.TFileTimeEx);
const
NSecsPerSec = 1000000000;
begin
while UnixTime.nanosec <= -NSecsPerSec do
begin
if (UnixTime.sec = Low(Int64)) then
begin
UnixTime.nanosec:= 0;
Exit;
end;
Dec(UnixTime.sec);
Inc(UnixTime.nanosec, NSecsPerSec);
end;
while UnixTime.nanosec >= NSecsPerSec do
begin
if (UnixTime.sec = High(Int64)) then
begin
UnixTime.nanosec:= NSecsPerSec - 1;
Exit;
end;
Inc(UnixTime.sec);
Dec(UnixTime.nanosec, NSecsPerSec);
end;
if (UnixTime.nanosec < 0) then
begin
if (UnixTime.sec = Low(Int64)) then
begin
UnixTime.nanosec:= 0;
end
else begin
Dec(UnixTime.sec);
Inc(UnixTime.nanosec, NSecsPerSec);
end;
end;
end;
function UnixFileTimeToDateTime(UnixTime: TUnixFileTime) : TDateTime;
var
filetime: DCBasicTypes.TFileTimeEx;
@ -512,6 +549,8 @@ var
ATime: TTimeStruct;
Milliseconds: Word;
begin
NormalizeFileTime(UnixTime);
if (fpLocalTime(@UnixTime.sec, @ATime) = nil) then
Exit(UnixEpoch);