2007-08-22 Glenn Morris <rgm@gnu.org>
+ * files.el (backup-buffer-copy): Check backup directory is
+ writable, to avoid infloop deleting old backup.
+
* mail/rmail.el (rmail-movemail-variant-p): Call on load to set
movemail related variables.
(rmail-insert-inbox-text): Use only rmail-movemail-program, which
(defun backup-buffer-copy (from-name to-name modes)
(let ((umask (default-file-modes)))
+ (dir (or (file-name-directory to-name)
+ default-directory)))
+ ;; Can't delete or create files in a read-only directory.
+ (unless (file-writable-p dir)
+ (signal 'file-error (list "Directory is not writable" dir)))
(unwind-protect
(progn
;; Create temp files with strict access rights. It's easy to
(set-default-file-modes ?\700)
(while (condition-case ()
(progn
+ ;; If we allow for the possibility of something
+ ;; creating the file between delete and copy
+ ;; (below), we must also allow for the
+ ;; possibility of something deleting it between
+ ;; a file-exists-p check and a delete.
(condition-case nil
(delete-file to-name)
(file-error nil))
(file-already-exists t))
;; The file was somehow created by someone else between
;; `delete-file' and `copy-file', so let's try again.
+ ;; Does that every actually happen in practice?
+ ;; This is a potential infloop, which seems bad...
+ ;; rms says "I think there is also a possible race
+ ;; condition for making backup files" (emacs-devel 20070821).
nil))
;; Reset the umask.
(set-default-file-modes umask)))