mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-28 19:42:02 +00:00
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)
This commit is contained in:
parent
8fca44da81
commit
6237aec6ca
@ -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)))
|
||||
|
Loading…
Reference in New Issue
Block a user