Commit 39adff0d authored by Paul Eggert's avatar Paul Eggert
Browse files

Fix bugs in file timestamp newness comparisons.

* fileio.c (Ffile_newer_than_file_p):
* lread.c (Fload): Use full timestamp resolution of files,
not just the 1-second resolution, so that files that are only
slightly newer still count as newer.
* fileio.c (Ffile_newer_than_file_p): Don't assume file
timestamps fit in 'int'; this fixes a Y2038 bug on most hosts.
parent dbeed9a6
2012-07-04 Paul Eggert <eggert@cs.ucla.edu>
Fix bugs in file timestamp newness comparisons.
* fileio.c (Ffile_newer_than_file_p):
* lread.c (Fload): Use full timestamp resolution of files,
not just the 1-second resolution, so that files that are only
slightly newer still count as newer.
* fileio.c (Ffile_newer_than_file_p): Don't assume file
timestamps fit in 'int'; this fixes a Y2038 bug on most hosts.
2012-07-03 Paul Eggert <eggert@cs.ucla.edu> 2012-07-03 Paul Eggert <eggert@cs.ucla.edu>
* fileio.c: Improve handling of file time marker. (Bug#11852) * fileio.c: Improve handling of file time marker. (Bug#11852)
(special_mtime): New function. (special_mtime): New function.
(Finsert_file_contents, Fverify_visited_file_modtime): (Finsert_file_contents, Fverify_visited_file_modtime):
......
...@@ -3079,8 +3079,7 @@ otherwise, if FILE2 does not exist, the answer is t. */) ...@@ -3079,8 +3079,7 @@ otherwise, if FILE2 does not exist, the answer is t. */)
(Lisp_Object file1, Lisp_Object file2) (Lisp_Object file1, Lisp_Object file2)
{ {
Lisp_Object absname1, absname2; Lisp_Object absname1, absname2;
struct stat st; struct stat st1, st2;
int mtime1;
Lisp_Object handler; Lisp_Object handler;
struct gcpro gcpro1, gcpro2; struct gcpro gcpro1, gcpro2;
...@@ -3106,15 +3105,14 @@ otherwise, if FILE2 does not exist, the answer is t. */) ...@@ -3106,15 +3105,14 @@ otherwise, if FILE2 does not exist, the answer is t. */)
absname2 = ENCODE_FILE (absname2); absname2 = ENCODE_FILE (absname2);
UNGCPRO; UNGCPRO;
if (stat (SSDATA (absname1), &st) < 0) if (stat (SSDATA (absname1), &st1) < 0)
return Qnil; return Qnil;
mtime1 = st.st_mtime; if (stat (SSDATA (absname2), &st2) < 0)
if (stat (SSDATA (absname2), &st) < 0)
return Qt; return Qt;
return (mtime1 > st.st_mtime) ? Qt : Qnil; return (EMACS_TIME_GT (get_stat_mtime (&st1), get_stat_mtime (&st2))
? Qt : Qnil);
} }
#ifndef READ_BUF_SIZE #ifndef READ_BUF_SIZE
......
...@@ -26,6 +26,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ...@@ -26,6 +26,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <errno.h> #include <errno.h>
#include <limits.h> /* For CHAR_BIT. */ #include <limits.h> /* For CHAR_BIT. */
#include <setjmp.h> #include <setjmp.h>
#include <stat-time.h>
#include "lisp.h" #include "lisp.h"
#include "intervals.h" #include "intervals.h"
#include "character.h" #include "character.h"
...@@ -1214,7 +1215,8 @@ Return t if the file exists and loads successfully. */) ...@@ -1214,7 +1215,8 @@ Return t if the file exists and loads successfully. */)
SSET (efound, SBYTES (efound) - 1, 'c'); SSET (efound, SBYTES (efound) - 1, 'c');
} }
if (result == 0 && s1.st_mtime < s2.st_mtime) if (result == 0
&& EMACS_TIME_LT (get_stat_mtime (&s1), get_stat_mtime (&s2)))
{ {
/* Make the progress messages mention that source is newer. */ /* Make the progress messages mention that source is newer. */
newer = 1; newer = 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment