* dired.c (Ffile_attributes): Don't use 32-bit hack on 64-bit hosts.
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 13 Jun 2011 06:34:04 +0000 (23:34 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 13 Jun 2011 06:34:04 +0000 (23:34 -0700)
src/ChangeLog
src/dired.c

index 9c7cf3c..6562df0 100644 (file)
@@ -1,5 +1,7 @@
 2011-06-13  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * dired.c (Ffile_attributes): Don't use 32-bit hack on 64-bit hosts.
+
        * unexelf.c (unexec): Don't assume BSS addr fits in unsigned.
 
        * xterm.c (handle_one_xevent): Omit unnecessary casts to unsigned.
index a958820..3ab1ba8 100644 (file)
@@ -978,11 +978,14 @@ so last access time will always be midnight of that day.  */)
   values[4] = make_time (s.st_atime);
   values[5] = make_time (s.st_mtime);
   values[6] = make_time (s.st_ctime);
-  values[7] = make_fixnum_or_float (s.st_size);
-  /* If the size is negative, and its type is long, convert it back to
-     positive.  */
-  if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
-    values[7] = make_float ((double) ((unsigned long) s.st_size));
+
+  /* If the file size is a 4-byte type, assume that files of sizes in
+     the 2-4 GiB range wrap around to negative values, as this is a
+     common bug on older 32-bit platforms.  */
+  if (sizeof (s.st_size) == 4)
+    values[7] = make_fixnum_or_float (s.st_size & 0xffffffffu);
+  else
+    values[7] = make_fixnum_or_float (s.st_size);
 
   filemodestring (&s, modes);
   values[8] = make_string (modes, 10);