]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix Tramp bug#42538
authorMichael Albinus <michael.albinus@gmx.de>
Thu, 30 Jul 2020 11:46:22 +0000 (13:46 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Thu, 30 Jul 2020 11:46:22 +0000 (13:46 +0200)
* lisp/net/tramp-sh.el (tramp-set-remote-path): Send the command
in several chunks if it is too large.  (Bug#42538)

lisp/net/tramp-sh.el

index 4dc95b1bb0508ed1488eb89ac3bd72e0e8a73ef6..1a867c30feb99aa324cf0691051d41a9d529c2ab 100644 (file)
@@ -4004,22 +4004,28 @@ whether it exists and if so, it is added to the environment
 variable PATH."
   (let ((command
         (format
-         "PATH=%s; export PATH" (string-join (tramp-get-remote-path vec) ":")))
+         "PATH=%s && export PATH" (string-join (tramp-get-remote-path vec) ":")))
        (pipe-buf
         (with-tramp-connection-property vec "pipe-buf"
           (tramp-send-command-and-read
            vec "getconf PIPE_BUF / 2>/dev/null || echo 4096" 'noerror)))
-       tmpfile)
+       tmpfile chunk chunksize)
     (tramp-message vec 5 "Setting $PATH environment variable")
     (if (< (length command) pipe-buf)
        (tramp-send-command vec command)
-      ;; Use a temporary file.
-      (setq tmpfile (tramp-make-tramp-temp-file vec))
-      (tramp-send-command vec (format
-                              "cat >%s <<'%s'\n%s\n%s"
-                              (tramp-shell-quote-argument tmpfile)
-                              tramp-end-of-heredoc
-                              command tramp-end-of-heredoc))
+      ;; Use a temporary file.  We cannot use `write-region' because
+      ;; setting the remote path happens in the early connection
+      ;; handshake, and not all external tools are determined yet.
+      (setq command (concat command "\n")
+           tmpfile (tramp-make-tramp-temp-file vec))
+      (while (not (string-empty-p command))
+       (setq chunksize (min (length command) (/ pipe-buf 2))
+             chunk (substring command 0 chunksize)
+             command (substring command chunksize))
+       (tramp-send-command vec (format
+                                "echo -n %s >>%s"
+                                (tramp-shell-quote-argument chunk)
+                                (tramp-shell-quote-argument tmpfile))))
       (tramp-send-command vec (format ". %s" tmpfile))
       (tramp-send-command vec (format "rm -f %s" tmpfile)))))