emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master bc1c2cf: Fix some file-mode races


From: Paul Eggert
Subject: [Emacs-diffs] master bc1c2cf: Fix some file-mode races
Date: Mon, 16 Sep 2019 21:01:04 -0400 (EDT)

branch: master
commit bc1c2cf009e30af77523fd87a8910fdbc4284704
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Fix some file-mode races
    
    * lisp/emacs-lisp/autoload.el (autoload-ensure-file-writeable):
    * lisp/files.el (after-find-file):
    * lisp/gnus/gnus-start.el (gnus-dribble-read-file):
    * lisp/htmlfontify.el (hfy-copy-and-fontify-file):
    * lisp/server.el (server-ensure-safe-dir):
    Avoid a race when getting file permissions.
---
 lisp/emacs-lisp/autoload.el |  3 +--
 lisp/files.el               | 10 +++++-----
 lisp/gnus/gnus-start.el     |  5 ++---
 lisp/htmlfontify.el         |  6 +++---
 lisp/server.el              |  6 +++---
 5 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el
index a2dbd40..ce28271 100644
--- a/lisp/emacs-lisp/autoload.el
+++ b/lisp/emacs-lisp/autoload.el
@@ -398,9 +398,8 @@ FILE's name."
   ;; Probably pointless, but replaces the old AUTOGEN_VCS in lisp/Makefile,
   ;; which was designed to handle CVSREAD=1 and equivalent.
   (and autoload-ensure-writable
-       (file-exists-p file)
        (let ((modes (file-modes file)))
-         (if (zerop (logand modes #o0200))
+        (if (and modes (zerop (logand modes #o0200)))
              ;; Ignore any errors here, and let subsequent attempts
              ;; to write the file raise any real error.
              (ignore-errors (set-file-modes file (logior modes #o0200))))))
diff --git a/lisp/files.el b/lisp/files.el
index ce4dd99..5ceaacd 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2554,13 +2554,13 @@ unless NOMODES is non-nil."
       (auto-save-mode 1)))
   ;; Make people do a little extra work (C-x C-q)
   ;; before altering a backup file.
-  (when (backup-file-name-p buffer-file-name)
-    (setq buffer-read-only t))
   ;; When a file is marked read-only,
   ;; make the buffer read-only even if root is looking at it.
-  (when (and (file-modes (buffer-file-name))
-            (zerop (logand (file-modes (buffer-file-name)) #o222)))
-    (setq buffer-read-only t))
+  (unless buffer-read-only
+    (when (or (backup-file-name-p buffer-file-name)
+             (let ((modes (file-modes (buffer-file-name))))
+               (and modes (zerop (logand modes #o222)))))
+      (setq buffer-read-only t)))
   (unless nomodes
     (when (and view-read-only view-mode)
       (view-mode -1))
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index e8775c6..cb369f0 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -897,9 +897,8 @@ If REGEXP is given, lines that match it will be deleted."
            (set-buffer-modified-p t))
          ;; Set the file modes to reflect the .newsrc file modes.
          (save-buffer)
-         (when (and (file-exists-p gnus-current-startup-file)
-                    (file-exists-p dribble-file)
-                    (setq modes (file-modes gnus-current-startup-file)))
+         (when (and (setq modes (file-modes gnus-current-startup-file))
+                    (file-exists-p dribble-file))
            (gnus-set-file-modes dribble-file modes))
          (goto-char (point-min))
          (when (search-forward "Gnus was exited on purpose" nil t)
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index b8442be..c1aaab5 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -1938,9 +1938,9 @@ adding an extension of `hfy-extn'.  Fontification is 
actually done by
                  (set-buffer  html)
                  (write-file (concat target hfy-extn))
                  (kill-buffer html))
-        ;; #o0200 == 128, but emacs20 doesn't know that
-        (if (and (file-exists-p target) (not (file-writable-p target)))
-            (set-file-modes target (logior (file-modes target) 128)))
+       (let ((modes (file-modes target)))
+         (if (and modes (not (file-writable-p target)))
+             (set-file-modes target (logior modes #o0200))))
         (copy-file (buffer-file-name source) target 'overwrite))
       (kill-buffer source)) ))
 
diff --git a/lisp/server.el b/lisp/server.el
index ac81cdb..45fa55a 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -563,9 +563,9 @@ See variable `server-auth-dir' for details."
                      (format "it is not owned by you (owner = %s (%d))"
                              (user-full-name uid) uid))
                     (w32 nil)           ; on NTFS?
-                    ((/= 0 (logand ?\077 (file-modes dir)))
-                     (format "it is accessible by others (%03o)"
-                             (file-modes dir)))
+                    ((let ((modes (file-modes dir)))
+                       (unless (zerop (logand (or modes 0) #o077))
+                         (format "it is accessible by others (%03o)" modes))))
                     (t nil))))
       (when unsafe
         (error "`%s' is not a safe directory because %s"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]