emacs-diffs
[Top][All Lists]
Advanced

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

master 6237aec6ca: Fix file name quoting in tramp-smb.el


From: Michael Albinus
Subject: master 6237aec6ca: Fix file name quoting in tramp-smb.el
Date: Wed, 15 Jun 2022 06:43:31 -0400 (EDT)

branch: master
commit 6237aec6ca2dcd2958999323b7ccf7e9c502dd94
Author: Michael Albinus <michael.albinus@gmx.de>
Commit: Michael Albinus <michael.albinus@gmx.de>

    Fix file name quoting in tramp-smb.el
    
    * lisp/net/tramp-smb.el (tramp-smb-shell-quote-localname): New defun.
    (tramp-smb-handle-add-name-to-file, tramp-smb-handle-copy-file)
    (tramp-smb-handle-delete-directory)
    (tramp-smb-handle-delete-file)
    (tramp-smb-do-file-attributes-with-stat)
    (tramp-smb-handle-file-local-copy)
    (tramp-smb-handle-file-system-info)
    (tramp-smb-handle-make-directory-internal)
    (tramp-smb-handle-make-symbolic-link)
    (tramp-smb-handle-process-file, tramp-smb-handle-rename-file)
    (tramp-smb-handle-set-file-modes)
    (tramp-smb-handle-start-file-process)
    (tramp-smb-handle-write-region, tramp-smb-get-file-entries)
    (tramp-smb-get-stat-capability): Use it.
    (tramp-smb-get-localname): Remove superfluous test.  (Bug#55855)
---
 lisp/net/tramp-smb.el | 110 +++++++++++++++++++++++++++-----------------------
 1 file changed, 59 insertions(+), 51 deletions(-)

diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 8037c89829..3654910133 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -386,14 +386,13 @@ arguments to pass to the OPERATION."
       ;; We must also flush the cache of the directory, because
       ;; `file-attributes' reads the values from there.
       (tramp-flush-file-properties v2 v2-localname)
-      (unless
-         (tramp-smb-send-command
-          v1
-          (format
-           "%s \"%s\" \"%s\""
-           (if (tramp-smb-get-cifs-capabilities v1) "link" "hardlink")
-           (tramp-smb-get-localname v1)
-           (tramp-smb-get-localname v2)))
+      (unless (tramp-smb-send-command
+              v1
+              (format
+               "%s %s %s"
+               (if (tramp-smb-get-cifs-capabilities v1) "link" "hardlink")
+               (tramp-smb-shell-quote-localname v1)
+               (tramp-smb-shell-quote-localname v2)))
        (tramp-error
         v2 'file-error
         "error with add-name-to-file, see buffer `%s' for details"
@@ -641,9 +640,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
            (tramp-error
             v 'file-error "Target `%s' must contain a share name" newname))
          (unless (tramp-smb-send-command
-                  v (format "put \"%s\" \"%s\""
-                            (tramp-compat-file-name-unquote filename)
-                            (tramp-smb-get-localname v)))
+                  v (format "put %s %s"
+                            (tramp-smb-shell-quote-argument filename)
+                            (tramp-smb-shell-quote-localname v)))
            (tramp-error
             v 'file-error "Cannot copy `%s' to `%s'" filename newname)))))
 
@@ -672,10 +671,10 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       (tramp-flush-directory-properties v localname)
       (unless (tramp-smb-send-command
               v (format
-                 "%s \"%s\""
+                 "%s %s"
                  (if (tramp-smb-get-cifs-capabilities v)
                      "posix_rmdir" "rmdir")
-                 (tramp-smb-get-localname v)))
+                 (tramp-smb-shell-quote-localname v)))
        ;; Error.
        (with-current-buffer (tramp-get-connection-buffer v)
          (goto-char (point-min))
@@ -698,9 +697,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
          (move-file-to-trash filename)
        (unless (tramp-smb-send-command
                 v (format
-                   "%s \"%s\""
+                   "%s %s"
                    (if (tramp-smb-get-cifs-capabilities v) "posix_unlink" "rm")
-                   (tramp-smb-get-localname v)))
+                   (tramp-smb-shell-quote-localname v)))
          ;; Error.
          (with-current-buffer (tramp-get-connection-buffer v)
            (goto-char (point-min))
@@ -898,7 +897,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
    vec 5 "file attributes with stat: %s" (tramp-file-name-localname vec))
   (let* (size id link uid gid atime mtime ctime mode inode)
     (when (tramp-smb-send-command
-          vec (format "stat \"%s\"" (tramp-smb-get-localname vec)))
+          vec (format "stat %s" (tramp-smb-shell-quote-localname vec)))
 
       ;; Loop the listing.
       (with-current-buffer (tramp-get-connection-buffer vec)
@@ -972,7 +971,8 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
          (when (and (stringp id)
                     (tramp-smb-send-command
                      vec
-                     (format "readlink \"%s\"" (tramp-smb-get-localname vec))))
+                     (format
+                      "readlink %s" (tramp-smb-shell-quote-localname vec))))
            (goto-char (point-min))
            (and (looking-at ".+ -> \\(.+\\)")
                 (setq id (match-string 1))))
@@ -991,8 +991,9 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       (with-tramp-progress-reporter
          v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
        (unless (tramp-smb-send-command
-                v (format "get \"%s\" \"%s\""
-                          (tramp-smb-get-localname v) tmpfile))
+                v (format "get %s %s"
+                          (tramp-smb-shell-quote-localname v)
+                          (tramp-smb-shell-quote-argument tmpfile)))
          ;; Oops, an error.  We shall cleanup.
          (delete-file tmpfile)
          (tramp-error
@@ -1025,7 +1026,7 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       (when (tramp-smb-get-share v)
        (tramp-message v 5 "file system info: %s" localname)
        (tramp-smb-send-command
-        v (format "du %s/*" (tramp-smb-get-localname v)))
+        v (format "du %s/*" (tramp-smb-shell-quote-localname v)))
        (with-current-buffer (tramp-get-connection-buffer v)
          (let (total avail blocksize)
            (goto-char (point-min))
@@ -1215,18 +1216,17 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
   (unless (file-name-absolute-p directory)
     (setq directory (expand-file-name directory default-directory)))
   (with-parsed-tramp-file-name directory nil
-    (let* ((file (tramp-smb-get-localname v)))
-      (when (file-directory-p (file-name-directory directory))
-       (tramp-smb-send-command
-        v
-        (if (tramp-smb-get-cifs-capabilities v)
-            (format "posix_mkdir \"%s\" %o" file (default-file-modes))
-          (format "mkdir \"%s\"" file)))
-       ;; We must also flush the cache of the directory, because
-       ;; `file-attributes' reads the values from there.
-       (tramp-flush-file-properties v localname))
-      (unless (file-directory-p directory)
-       (tramp-error v 'file-error "Couldn't make directory %s" directory)))))
+    (when (file-directory-p (file-name-directory directory))
+      (tramp-smb-send-command
+       v (if (tramp-smb-get-cifs-capabilities v)
+            (format "posix_mkdir %s %o"
+                    (tramp-smb-shell-quote-localname v) (default-file-modes))
+          (format "mkdir %s" (tramp-smb-shell-quote-localname v))))
+      ;; We must also flush the cache of the directory, because
+      ;; `file-attributes' reads the values from there.
+      (tramp-flush-file-properties v localname))
+    (unless (file-directory-p directory)
+      (tramp-error v 'file-error "Couldn't make directory %s" directory))))
 
 (defun tramp-smb-handle-make-symbolic-link
   (target linkname &optional ok-if-already-exists)
@@ -1270,11 +1270,10 @@ component is used as the target of the symlink."
        ;; `file-attributes' reads the values from there.
        (tramp-flush-file-properties v localname)
 
-       (unless
-           (tramp-smb-send-command
-            v (format "symlink \"%s\" \"%s\""
-                      (tramp-compat-file-name-unquote target)
-                      (tramp-smb-get-localname v)))
+       (unless (tramp-smb-send-command
+                v (format "symlink %s %s"
+                          (tramp-smb-shell-quote-argument target)
+                          (tramp-smb-shell-quote-localname v)))
          (tramp-error
           v 'file-error
           "error with make-symbolic-link, see buffer `%s' for details"
@@ -1357,7 +1356,9 @@ component is used as the target of the symlink."
            (tramp-smb-call-winexe v)
            (when (tramp-smb-get-share v)
              (tramp-smb-send-command
-              v (format "cd \"//%s%s\"" host (file-name-directory localname))))
+              v (format "cd //%s%s" host
+                        (tramp-smb-shell-quote-argument
+                         (file-name-directory localname)))))
            (tramp-smb-send-command v command)
            ;; Preserve command output.
            (narrow-to-region (point-max) (point-max))
@@ -1432,9 +1433,9 @@ component is used as the target of the symlink."
                 v2 'file-error
                 "Target `%s' must contain a share name" newname))
              (unless (tramp-smb-send-command
-                      v2 (format "rename \"%s\" \"%s\""
-                                 (tramp-smb-get-localname v1)
-                                 (tramp-smb-get-localname v2)))
+                      v2 (format "rename %s %s"
+                                 (tramp-smb-shell-quote-localname v1)
+                                 (tramp-smb-shell-quote-localname v2)))
                (tramp-error v2 'file-error "Cannot rename `%s'" filename))))
 
        ;; We must rename via copy.
@@ -1532,7 +1533,8 @@ component is used as the target of the symlink."
       (when (tramp-smb-get-cifs-capabilities v)
        (tramp-flush-file-properties v localname)
        (unless (tramp-smb-send-command
-                v (format "chmod \"%s\" %o" (tramp-smb-get-localname v) mode))
+                v
+                (format "chmod %s %o" (tramp-smb-shell-quote-localname v) 
mode))
          (tramp-error
           v 'file-error "Error while changing file's mode %s" filename))))))
 
@@ -1570,8 +1572,10 @@ component is used as the target of the symlink."
                  (when (tramp-smb-get-share v)
                    (tramp-smb-send-command
                     v (format
-                       "cd \"//%s%s\""
-                       host (file-name-directory localname))))
+                       "cd //%s%s"
+                       host
+                       (tramp-smb-shell-quote-argument
+                        (file-name-directory localname)))))
                  (tramp-message v 6 "(%s); exit" command)
                  (tramp-send-string v command)))
              (setq p (tramp-get-connection-process v))
@@ -1635,8 +1639,9 @@ VEC or USER, or if there is no home directory, return 
nil."
          v 3 (format "Moving tmp file %s to %s" tmpfile filename)
        (unwind-protect
            (unless (tramp-smb-send-command
-                    v (format "put %s \"%s\""
-                              tmpfile (tramp-smb-get-localname v)))
+                    v (format "put %s %s"
+                              (tramp-smb-shell-quote-argument tmpfile)
+                              (tramp-smb-shell-quote-localname v)))
              (tramp-error v 'file-error "Cannot write `%s'" filename))
          (delete-file tmpfile))))))
 
@@ -1672,9 +1677,8 @@ If VEC has no cifs capabilities, exchange \"/\" by 
\"\\\\\"."
       (when (string-match "\\(\\$\\$\\)\\(/\\|$\\)" localname)
        (setq localname (replace-match "$" nil nil localname 1)))
 
-      ;; A period followed by a space, or trailing periods and spaces,
-      ;; are not supported.
-      (when (string-match-p "\\. \\|\\.$\\| $" localname)
+      ;; A trailing space is not supported.
+      (when (string-match-p " $" localname)
        (tramp-error
         vec 'file-error
         "Invalid file name %s" (tramp-make-tramp-file-name vec localname)))
@@ -1705,7 +1709,7 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME 
YEAR)."
          ;; Read entries.
          (if share
              (tramp-smb-send-command
-              v (format "dir \"%s*\"" (tramp-smb-get-localname v)))
+              v (format "dir %s*" (tramp-smb-shell-quote-localname v)))
            ;; `tramp-smb-maybe-open-connection' lists also the share names.
            (tramp-smb-maybe-open-connection v))
 
@@ -1909,7 +1913,7 @@ are listed.  Result is the list (LOCALNAME MODE SIZE 
MTIME)."
   (if (and (tramp-smb-get-share vec)
           (process-live-p (tramp-get-connection-process vec)))
       (with-tramp-connection-property (tramp-get-process vec) "stat-capability"
-       (tramp-smb-send-command vec "stat \"/\""))))
+       (tramp-smb-send-command vec "stat /"))))
 
 
 ;; Connection functions.
@@ -2169,6 +2173,10 @@ Removes smb prompt.  Returns nil if an error message has 
appeared."
   (let ((system-type 'ms-dos))
     (tramp-unquote-shell-quote-argument s)))
 
+(defun tramp-smb-shell-quote-localname (vec)
+  "Call `tramp-smb-shell-quote-argument' on localname of VEC."
+  (tramp-smb-shell-quote-argument (tramp-smb-get-localname vec)))
+
 (add-hook 'tramp-unload-hook
          (lambda ()
            (unload-feature 'tramp-smb 'force)))



reply via email to

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