2
0
Эх сурвалжийг харах

FIX: Range check error (fixes #2338)

Alexander Koblov 3 сар өмнө
parent
commit
3c9894fca3

+ 39 - 0
components/doublecmd/dcdatetimeutils.pas

@@ -499,6 +499,43 @@ end;
 
 
 
 
 {$IF DEFINED(UNIX)}
 {$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;
 function UnixFileTimeToDateTime(UnixTime: TUnixFileTime) : TDateTime;
 var
 var
   filetime: DCBasicTypes.TFileTimeEx;
   filetime: DCBasicTypes.TFileTimeEx;
@@ -512,6 +549,8 @@ var
   ATime: TTimeStruct;
   ATime: TTimeStruct;
   Milliseconds: Word;
   Milliseconds: Word;
 begin
 begin
+  NormalizeFileTime(UnixTime);
+
   if (fpLocalTime(@UnixTime.sec, @ATime) = nil) then
   if (fpLocalTime(@UnixTime.sec, @ATime) = nil) then
     Exit(UnixEpoch);
     Exit(UnixEpoch);