Forráskód Böngészése

FIX: Range check error with negative UNIX-time (fixes #1011)

Alexander Koblov 2 éve
szülő
commit
fd24b9c490

+ 1 - 8
components/doublecmd/dcbasictypes.pas

@@ -40,14 +40,7 @@ type
   TFileTime = TWinFileTime;
   TFileTimeEx = TFileTime;
 {$ELSE}
-  // Unix time (UTC).
-  // Unix defines time_t as signed integer,
-  // but we define it as unsigned because sign is not needed.
-  {$IFDEF cpu64}
-  TFileTime = QWord;
-  {$ELSE}
-  TFileTime = DWord;
-  {$ENDIF}
+  TFileTime = Int64;
 
   TFileTimeEx = record
     public

+ 7 - 7
components/doublecmd/dcunix.pas

@@ -302,20 +302,20 @@ end;
 
 function TDCStatHelper.mtime: TFileTimeEx;
 begin
-  Result.sec:= st_mtime;
-  Result.nanosec:= st_mtime_nsec;
+  Result.sec:= Int64(st_mtime);
+  Result.nanosec:= Int64(st_mtime_nsec);
 end;
 
 function TDCStatHelper.atime: TFileTimeEx;
 begin
-  Result.sec:= st_atime;
-  Result.nanosec:= st_atime_nsec;
+  Result.sec:= Int64(st_atime);
+  Result.nanosec:= Int64(st_atime_nsec);
 end;
 
 function TDCStatHelper.ctime: TFileTimeEx;
 begin
-  Result.sec:= st_ctime;
-  Result.nanosec:= st_ctime_nsec;
+  Result.sec:= Int64(st_ctime);
+  Result.nanosec:= Int64(st_ctime_nsec);
 end;
 {$ENDIF}
 
@@ -336,7 +336,7 @@ end;
 
 Function DC_fpLstat( const path:RawByteString; var Info:TDCStat ): cint; inline;
 begin
-  fpLstat( path, info );
+  Result:= fpLstat( path, info );
 end;
 
 {$ENDIF}

+ 3 - 3
src/ffileproperties.pas

@@ -210,11 +210,11 @@ begin
     ActiveFile.OwnerProperty.Owner:= FFileAttr.FindData.st_uid;
 {$ENDIF}
     if fpModificationTime in ActiveFile.SupportedProperties then
-      ActiveFile.ModificationTime:= FileTimeToDateTime(FFileAttr.LastWriteTime);
+      ActiveFile.ModificationTime:= FileTimeToDateTime(DCBasicTypes.TFileTime(FFileAttr.LastWriteTime));
     if fpChangeTime in ActiveFile.SupportedProperties then
-      ActiveFile.ChangeTime:= FileTimeToDateTime(FFileAttr.PlatformTime);
+      ActiveFile.ChangeTime:= FileTimeToDateTime(DCBasicTypes.TFileTime(FFileAttr.PlatformTime));
     if fpLastAccessTime in ActiveFile.SupportedProperties then
-      ActiveFile.LastAccessTime:= FileTimeToDateTime(FFileAttr.LastAccessTime);
+      ActiveFile.LastAccessTime:= FileTimeToDateTime(DCBasicTypes.TFileTime(FFileAttr.LastAccessTime));
   end;
 
   if (fsoSetFileProperty in aFileSource.GetOperationsTypes) then

+ 7 - 7
src/filesources/filesystem/ufilesystemfilesource.pas

@@ -231,11 +231,11 @@ begin
       SizeProperty := TFileSizeProperty.Create(Int64(pStatInfo^.st_size));
 
     ModificationTimeProperty := TFileModificationDateTimeProperty.Create(
-      FileTimeToDateTime(pStatInfo^.st_mtime));
+      FileTimeToDateTime(TUnixFileTime(pStatInfo^.st_mtime)));
     Properties[fpChangeTime] := TFileChangeDateTimeProperty.Create(
-      FileTimeToDateTime(pStatInfo^.st_ctime));
+      FileTimeToDateTime(TUnixFileTime(pStatInfo^.st_ctime)));
     LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create(
-      FileTimeToDateTime(pStatInfo^.st_atime));
+      FileTimeToDateTime(TUnixFileTime(pStatInfo^.st_atime)));
 
     LinkProperty := TFileLinkProperty.Create;
 
@@ -604,17 +604,17 @@ begin
 
       if not (fpModificationTime in AssignedProperties) then
         ModificationTimeProperty := TFileModificationDateTimeProperty.Create(
-          FileTimeToDateTime(StatInfo.st_mtime));
+          FileTimeToDateTime(TUnixFileTime(StatInfo.st_mtime)));
       if not (fpChangeTime in AssignedProperties) then
         Properties[fpChangeTime] := TFileChangeDateTimeProperty.Create(
-          FileTimeToDateTime(StatInfo.st_ctime));
+          FileTimeToDateTime(TUnixFileTime(StatInfo.st_ctime)));
       if not (fpLastAccessTime in AssignedProperties) then
         LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create(
-          FileTimeToDateTime(StatInfo.st_atime));
+          FileTimeToDateTime(TUnixFileTime(StatInfo.st_atime)));
 {$IF DEFINED(DARWIN)}
       if not (fpCreationTime in AssignedProperties) then
         CreationTimeProperty := TFileCreationDateTimeProperty.Create(
-          FileTimeToDateTime(StatInfo.st_birthtime));
+          FileTimeToDateTime(TUnixFileTime(StatInfo.st_birthtime)));
 {$ENDIF}
     end;