]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/tramp.el (tramp-make-temp-file): Backport from Tramp 2.1.
authorMichael Albinus <michael.albinus@gmx.de>
Wed, 11 Jun 2008 17:31:02 +0000 (17:31 +0000)
committerMichael Albinus <michael.albinus@gmx.de>
Wed, 11 Jun 2008 17:31:02 +0000 (17:31 +0000)
lisp/ChangeLog
lisp/net/tramp.el

index 58ecb708be7d0ccafff58b40fa10be2c1d8b6002..98c7a540e9fe27cf278f22b98028061c5c47946f 100644 (file)
@@ -1,3 +1,7 @@
+2008-06-11  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-make-temp-file): Backport from Tramp 2.1.
+
 2008-06-08  Michael Albinus  <michael.albinus@gmx.de>
 
        * uniquify.el (uniquify-get-proposed-name): Handle remote files.
index 5b2c9525b25e36cd1703a777635f96f22fb676bb..14cc6088497eab42079d467988da5455c09f947d 100644 (file)
@@ -3779,12 +3779,42 @@ This will break if COMMAND prints a newline, followed by the value of
 
 ;; File Editing.
 
+;; `make-temp-file' exists in Emacs only.  The third parameter SUFFIX
+;; has been introduced with Emacs 22.  We try it, if it fails, we fall
+;; back to `make-temp-name', creating the temporary file immediately
+;; in order to avoid a security hole.
 (defsubst tramp-make-temp-file (filename)
-  (concat
-   (funcall (if (fboundp 'make-temp-file) 'make-temp-file 'make-temp-name)
-           (expand-file-name tramp-temp-name-prefix
-                             (tramp-temporary-file-directory)))
-   (file-name-extension filename t)))
+  "Create a temporary file (compat function).
+Add the extension of FILENAME, if existing."
+  (let* (file-name-handler-alist
+        (prefix (expand-file-name
+                 (symbol-value 'tramp-temp-name-prefix)
+                 (tramp-temporary-file-directory)))
+        (extension (file-name-extension filename t))
+        result)
+    (condition-case nil
+       (setq result
+             (funcall (symbol-function 'make-temp-file) prefix nil extension))
+      (error
+       ;; We use our own implementation, taken from files.el.
+       (while
+          (condition-case ()
+              (progn
+                (setq result (concat (make-temp-name prefix) extension))
+                (write-region
+                 "" nil result nil 'silent nil
+                 ;; 7th parameter is MUSTBENEW in Emacs, and
+                 ;; CODING-SYSTEM in XEmacs.  It is not a security
+                 ;; hole in XEmacs if we cannot use this parameter,
+                 ;; because XEmacs uses a user-specific subdirectory
+                 ;; with 0700 permissions.
+                 (when (not (featurep 'xemacs)) 'excl))
+                nil)
+            (file-already-exists t))
+        ;; The file was somehow created by someone else between
+        ;; `make-temp-name' and `write-region', let's try again.
+        nil)))
+    result))
 
 (defun tramp-handle-file-local-copy (filename)
   "Like `file-local-copy' for tramp files."