# HG changeset patch # User Juanma Barranquero # Date 1253372164 0 # Node ID 84836b2f2c936813ed4b7cb5e51966926ba2fbb8 # Parent c8c4851869912453809cb97fc9eb053b6518c2da This fixes bug#4197 (merged to bug#865, though not identical). * server.el (server-auth-dir): Add docstring note about FAT32. (server-ensure-safe-dir): Accept FAT32 directories as "safe", but warn against using them. diff -r c8c485186991 -r 84836b2f2c93 lisp/ChangeLog --- a/lisp/ChangeLog Sat Sep 19 11:45:57 2009 +0000 +++ b/lisp/ChangeLog Sat Sep 19 14:56:04 2009 +0000 @@ -1,3 +1,11 @@ +2009-09-19 Juanma Barranquero + Eli Zaretskii + + This fixes bug#4197 (merged to bug#865, though not identical). + * server.el (server-auth-dir): Add docstring note about FAT32. + (server-ensure-safe-dir): Accept FAT32 directories as "safe", + but warn against using them. + 2009-09-19 Nick Roberts * progmodes/gdb-mi.el (gdb-var-update-handler-1): Include case of diff -r c8c485186991 -r 84836b2f2c93 lisp/server.el --- a/lisp/server.el Sat Sep 19 11:45:57 2009 +0000 +++ b/lisp/server.el Sat Sep 19 14:56:04 2009 +0000 @@ -113,7 +113,12 @@ (put 'server-host 'risky-local-variable t) (defcustom server-auth-dir (locate-user-emacs-file "server/") - "Directory for server authentication files." + "Directory for server authentication files. + +NOTE: On FAT32 filesystems, directories are not secure; +files can be read and modified by any user or process. +It is strongly suggested to set `server-auth-dir' to a +directory residing in a NTFS partition instead." :group 'server :type 'directory :version "22.1") @@ -453,11 +458,31 @@ (unless attrs (letf (((default-file-modes) ?\700)) (make-directory dir t)) (setq attrs (file-attributes dir 'integer))) + ;; Check that it's safe for use. - (unless (and (eq t (car attrs)) (eql (nth 2 attrs) (user-uid)) - (or (eq system-type 'windows-nt) - (zerop (logand ?\077 (file-modes dir))))) - (error "The directory %s is unsafe" dir)))) + (let* ((uid (nth 2 attrs)) + (w32 (eq system-type 'windows-nt)) + (safe (catch :safe + (unless (eq t (car attrs)) ; is a dir? + (throw :safe nil)) + (when (and w32 (zerop uid)) ; on FAT32? + (display-warning + 'server + (format "Using `%s' to store Emacs-server authentication files. +Directories on FAT32 filesystems are NOT secure against tampering. +See variable `server-auth-dir' for details." + (file-name-as-directory dir)) + :warning) + (throw :safe t)) + (unless (eql uid (user-uid)) ; is the dir ours? + (throw :safe nil)) + (when w32 ; on NTFS? + (throw :safe t)) + (unless (zerop (logand ?\077 (file-modes dir))) + (throw :safe nil)) + t))) + (unless safe + (error "The directory `%s' is unsafe" dir))))) ;;;###autoload (defun server-start (&optional leave-dead)