From: Paul Eggert Date: Tue, 13 Nov 2012 01:35:14 +0000 (-0800) Subject: Fix a race with verify-visited-file-modtime. X-Git-Tag: emacs-24.3.90~173^2~18^2~128 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b95a9c0cba301ef8f1920a1d123ccd6873c14a63;p=emacs.git 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 --- 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;