1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-30 08:09:04 +00:00

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
This commit is contained in:
Paul Eggert 2012-11-12 17:35:14 -08:00
parent 231d8498eb
commit b95a9c0cba
2 changed files with 13 additions and 8 deletions

View File

@ -1,3 +1,14 @@
2012-11-13 Paul Eggert <eggert@cs.ucla.edu>
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 <dmantipov@yandex.ru>
* frame.h (struct frame): Convert external_tool_bar member to

View File

@ -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;