all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: Dmitry Gutov <raaahh@gmail.com>
Cc: 13149@debbugs.gnu.org
Subject: bug#13149: 24.3.50; Emacs thinks file was changed outside Emacs, but it was not
Date: Thu, 17 Jan 2013 13:14:37 -0800	[thread overview]
Message-ID: <50F869BD.1040302@cs.ucla.edu> (raw)
In-Reply-To: <50F7D358.9030100@gmail.com>

On 01/17/13 02:32, Dmitry Gutov wrote:
> I think we need this to work without requiring the user to customize a variable.

I agree.  But I would rather avoid having Emacs assume
that file system time stamps can be off by several seconds,
since that'll cause Emacs to miss changes that it should report.

Does the following patch help?  It should be applied anyway,
since it closes a minor race even on non-buggy file systems.
I'm hoping that it helps to work around your bug by using
fstat both times, instead of fstat in one place and stat
in another, since the file system bug seems to be that
fstat and stat disagree.

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2013-01-17 06:29:40 +0000
+++ src/ChangeLog	2013-01-17 21:09:26 +0000
@@ -1,3 +1,11 @@
+2013-01-17  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Close a race when statting and reading files (Bug#13149).
+	* fileio.c (Finsert_file_contents): Use open+fstat, not stat+open.
+	This avoids a race if the file is renamed between stat and open.
+	Also, perhaps it works around a file system bug that happen in
+	virtualized environments based on MS-Windows hosts.
+
 2013-01-17  Dmitry Antipov  <dmantipov@yandex.ru>
 
 	* lisp.h (toplevel): Add comment about using Lisp_Save_Value

=== modified file 'src/fileio.c'
--- src/fileio.c	2013-01-17 06:29:40 +0000
+++ src/fileio.c	2013-01-17 21:09:26 +0000
@@ -3492,7 +3492,6 @@
   (Lisp_Object filename, Lisp_Object visit, Lisp_Object beg, Lisp_Object end, Lisp_Object replace)
 {
   struct stat st;
-  int file_status;
   EMACS_TIME mtime;
   int fd;
   ptrdiff_t inserted = 0;
@@ -3554,26 +3553,9 @@
   orig_filename = filename;
   filename = ENCODE_FILE (filename);
 
-  fd = -1;
-
-#ifdef WINDOWSNT
-  {
-    Lisp_Object tem = Vw32_get_true_file_attributes;
-
-    /* Tell stat to use expensive method to get accurate info.  */
-    Vw32_get_true_file_attributes = Qt;
-    file_status = stat (SSDATA (filename), &st);
-    Vw32_get_true_file_attributes = tem;
-  }
-#else
-  file_status = stat (SSDATA (filename), &st);
-#endif /* WINDOWSNT */
-
-  if (file_status == 0)
-    mtime = get_stat_mtime (&st);
-  else
+  fd = emacs_open (SSDATA (filename), O_RDONLY, 0);
+  if (fd < 0)
     {
-    badopen:
       save_errno = errno;
       if (NILP (visit))
 	report_file_error ("Opening input file", Fcons (orig_filename, Qnil));
@@ -3585,6 +3567,17 @@
       goto notfound;
     }
 
+  /* Replacement should preserve point as it preserves markers.  */
+  if (!NILP (replace))
+    record_unwind_protect (restore_point_unwind, Fpoint_marker ());
+
+  record_unwind_protect (close_file_unwind, make_number (fd));
+
+  if (fstat (fd, &st) != 0)
+    report_file_error ("Getting input file status",
+		       Fcons (orig_filename, Qnil));
+  mtime = get_stat_mtime (&st);
+
   /* This code will need to be changed in order to work on named
      pipes, and it's probably just not worth it.  So we should at
      least signal an error.  */
@@ -3600,17 +3593,6 @@
 		  build_string ("not a regular file"), orig_filename);
     }
 
-  if (fd < 0)
-    if ((fd = emacs_open (SSDATA (filename), O_RDONLY, 0)) < 0)
-      goto badopen;
-
-  /* Replacement should preserve point as it preserves markers.  */
-  if (!NILP (replace))
-    record_unwind_protect (restore_point_unwind, Fpoint_marker ());
-
-  record_unwind_protect (close_file_unwind, make_number (fd));
-
-
   if (!NILP (visit))
     {
       if (!NILP (beg) || !NILP (end))







  parent reply	other threads:[~2013-01-17 21:14 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-11 21:51 bug#13149: 24.3.50; Emacs thinks file was changed outside Emacs, but it was not Drew Adams
2012-12-11 22:48 ` Dmitry Gutov
2012-12-11 22:54   ` Drew Adams
2013-01-14  5:10     ` Dmitry Gutov
2013-01-14 14:57       ` Dmitry Gutov
2013-01-14 17:02         ` Eli Zaretskii
2013-01-14 22:22           ` Dmitry Gutov
2013-01-14 18:28         ` Paul Eggert
2013-01-14 22:20           ` Dmitry Gutov
2013-01-15  6:45             ` Paul Eggert
2013-01-15  8:54               ` Dmitry Gutov
2013-01-15 17:31                 ` Paul Eggert
2013-01-15 21:38                   ` Dmitry Gutov
2013-01-15 21:47                     ` Paul Eggert
2013-01-15 22:11                       ` Dmitry Gutov
2013-01-15 22:38                         ` Paul Eggert
2013-01-15 23:09                           ` Dmitry Gutov
2013-01-15 23:44                             ` Dmitry Gutov
2013-01-16  5:57                               ` Paul Eggert
2013-01-17 10:32                                 ` Dmitry Gutov
2013-01-17 17:05                                   ` Eli Zaretskii
2013-01-18  4:15                                     ` Dmitry Gutov
2013-01-18  7:49                                       ` Eli Zaretskii
2013-01-17 21:14                                   ` Paul Eggert [this message]
2013-01-18  4:55                                     ` Dmitry Gutov
2013-01-18  5:26                                       ` Paul Eggert
2013-01-17 21:33                                   ` Paul Eggert
2013-01-18  4:36                                     ` Dmitry Gutov
2013-01-18  5:01                                       ` Paul Eggert
2013-01-18  5:10                                         ` Dmitry Gutov
2013-01-18  5:25                                           ` Paul Eggert
2013-01-18  5:54                                             ` Dmitry Gutov
2013-01-18  6:22                                               ` Dmitry Gutov
2013-01-18  7:56                                             ` Eli Zaretskii
2013-01-18 14:45                                               ` Dmitry Gutov
2013-01-18 21:35                                               ` Paul Eggert
2013-01-18 22:52                                                 ` Dmitry Gutov
2013-01-19  0:55                                                   ` Paul Eggert
2013-01-19  1:09                                                     ` Dmitry Gutov
2013-01-19  2:37                                                       ` Paul Eggert
2013-01-19  4:02                                                         ` Dmitry Gutov
2013-01-19  4:51                                                           ` Paul Eggert
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl! e.com>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl!>
     [not found]                                                               ` <e.com@[87.69.4.28]>
     [not found]                                                                 ` <83wq! urc1u3.fsf@gnu.org>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956EB54214@us.oracl!e.com>
     [not found]                                                             ` <DEB91990BBBB4255BFB466956! EB54214@us.oracl!>
2013-01-19  5:02                                                             ` Drew Adams
2013-02-01 16:32                                                               ` Drew Adams
2013-02-01 16:43                                                                 ` Drew Adams
2013-02-01 16:49                                                                   ` Drew Adams
2013-02-01 18:43                                                                 ` Eli Zaretskii
2013-02-01 19:19                                                                   ` Drew Adams
2013-02-01 19:36                                                                     ` Eli Zaretskii
2013-02-01 22:15                                                                       ` Drew Adams
2013-02-02  9:41                                                                         ` Eli Zaretskii
2013-02-02 16:06                                                                           ` Drew Adams
2013-02-01 19:38                                                                     ` Eli Zaretskii
2013-02-01 22:13                                                                       ` Drew Adams
2013-02-01 21:05                                                                 ` Paul Eggert
2013-02-01 22:14                                                                   ` Drew Adams
2013-02-01 22:22                                                                     ` Paul Eggert
2013-02-02  9:43                                                                       ` Eli Zaretskii
2013-03-19  8:39                                                                         ` Uwe Siart
2013-03-19 16:55                                                                           ` Eli Zaretskii
2013-03-19 17:50                                                                             ` Uwe Siart
2014-02-06  1:40                                                                             ` Lars Ingebrigtsen
2014-02-06  6:12                                                                               ` Drew Adams
2014-02-06  6:19                                                                               ` Eli Zaretskii
2013-02-02  9:38                                                                   ` Eli Zaretskii
2013-02-02 19:31                                                                     ` Paul Eggert
2013-01-18  7:57                                       ` Eli Zaretskii
2013-01-17 17:16                                 ` David Engster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50F869BD.1040302@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=13149@debbugs.gnu.org \
    --cc=raaahh@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.