From 39adff0d6323578236a6bd9022c42460e8628629 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 3 Jul 2012 17:04:46 -0700 Subject: [PATCH] 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. --- src/ChangeLog | 11 +++++++++++ src/fileio.c | 12 +++++------- src/lread.c | 4 +++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 87e92170261..5433c2ff831 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,16 @@ +2012-07-04 Paul Eggert + + 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 + * fileio.c: Improve handling of file time marker. (Bug#11852) (special_mtime): New function. (Finsert_file_contents, Fverify_visited_file_modtime): diff --git a/src/fileio.c b/src/fileio.c index 6c3a3b206e8..1dadd06c283 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -3079,8 +3079,7 @@ otherwise, if FILE2 does not exist, the answer is t. */) (Lisp_Object file1, Lisp_Object file2) { Lisp_Object absname1, absname2; - struct stat st; - int mtime1; + struct stat st1, st2; Lisp_Object handler; struct gcpro gcpro1, gcpro2; @@ -3106,15 +3105,14 @@ otherwise, if FILE2 does not exist, the answer is t. */) absname2 = ENCODE_FILE (absname2); UNGCPRO; - if (stat (SSDATA (absname1), &st) < 0) + if (stat (SSDATA (absname1), &st1) < 0) return Qnil; - mtime1 = st.st_mtime; - - if (stat (SSDATA (absname2), &st) < 0) + if (stat (SSDATA (absname2), &st2) < 0) 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 diff --git a/src/lread.c b/src/lread.c index 7a0b20880e9..1e496bf9742 100644 --- a/src/lread.c +++ b/src/lread.c @@ -26,6 +26,7 @@ along with GNU Emacs. If not, see . */ #include #include /* For CHAR_BIT. */ #include +#include #include "lisp.h" #include "intervals.h" #include "character.h" @@ -1214,7 +1215,8 @@ Return t if the file exists and loads successfully. */) 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. */ newer = 1; -- 2.39.2