From b95a9c0cba301ef8f1920a1d123ccd6873c14a63 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 12 Nov 2012 17:35:14 -0800 Subject: [PATCH] Fix a race with verify-visited-file-modtime. Since at least 1991 Emacs has ignored an mtime difference of no more than one second, but my guess is that this was to work around file system bugs that were fixed long ago. Since the race is causing problems now, let's remove that code. * fileio.c (Fverify_visited_file_modtime): Do not accept a file whose time stamp is off by no more than a second. Insist that the file time stamps match exactly. Fixes: debbugs:12863 --- src/ChangeLog | 11 +++++++++++ src/fileio.c | 10 ++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index e8ac547ff2a..5905c667852 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2012-11-13 Paul Eggert + + Fix a race with verify-visited-file-modtime (Bug#12863). + Since at least 1991 Emacs has ignored an mtime difference of no + more than one second, but my guess is that this was to work around + file system bugs that were fixed long ago. Since the race is + causing problems now, let's remove that code. + * fileio.c (Fverify_visited_file_modtime): Do not accept a file + whose time stamp is off by no more than a second. Insist that the + file time stamps match exactly. + 2012-11-12 Dmitry Antipov * frame.h (struct frame): Convert external_tool_bar member to diff --git a/src/fileio.c b/src/fileio.c index d47d7dd9e0b..b9541e78838 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5076,7 +5076,7 @@ See Info node `(elisp)Modification Time' for more details. */) struct stat st; Lisp_Object handler; Lisp_Object filename; - EMACS_TIME mtime, diff; + EMACS_TIME mtime; if (NILP (buf)) b = current_buffer; @@ -5101,13 +5101,7 @@ See Info node `(elisp)Modification Time' for more details. */) mtime = (stat (SSDATA (filename), &st) == 0 ? get_stat_mtime (&st) : time_error_value (errno)); - if ((EMACS_TIME_EQ (mtime, b->modtime) - /* If both exist, accept them if they are off by one second. */ - || (EMACS_TIME_VALID_P (mtime) && EMACS_TIME_VALID_P (b->modtime) - && ((diff = (EMACS_TIME_LT (mtime, b->modtime) - ? sub_emacs_time (b->modtime, mtime) - : sub_emacs_time (mtime, b->modtime))), - EMACS_TIME_LE (diff, make_emacs_time (1, 0))))) + if (EMACS_TIME_EQ (mtime, b->modtime) && (st.st_size == b->modtime_size || b->modtime_size < 0)) return Qt; -- 2.39.2