]> andersk Git - openssh.git/commitdiff
- dtucker@cvs.openbsd.org 2007/06/12 13:54:28
authordtucker <dtucker>
Tue, 12 Jun 2007 14:02:07 +0000 (14:02 +0000)
committerdtucker <dtucker>
Tue, 12 Jun 2007 14:02:07 +0000 (14:02 +0000)
     [scp.c]
     Encode filename with strnvis if the name contains a newline (which can't
     be represented in the scp protocol), from bz #891.  ok markus@

ChangeLog
scp.c

index acccdadfda8aff166ed41563e6826a223712e922..dc53199839b141adc169543bfd22dfca260a1aec 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - jmc@cvs.openbsd.org 2007/06/12 13:43:55
      [ssh.1]
      add -K to SYNOPSIS;
+   - dtucker@cvs.openbsd.org 2007/06/12 13:54:28
+     [scp.c]
+     Encode filename with strnvis if the name contains a newline (which can't
+     be represented in the scp protocol), from bz #891.  ok markus@
 
 20070611
  - (djm) Bugzilla #1306: silence spurious error messages from hang-on-exit
diff --git a/scp.c b/scp.c
index 087e64a424d4bb6fbd70fa3e268727dcff06cac9..92a67b7339342faff35aa38ac5572b838964d270 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scp.c,v 1.157 2007/06/12 08:24:20 djm Exp $ */
+/* $OpenBSD: scp.c,v 1.158 2007/06/12 13:54:28 dtucker Exp $ */
 /*
  * scp - secure remote copy.  This is basically patched BSD rcp which
  * uses ssh to do the data transfer (instead of using rcmd).
@@ -96,6 +96,9 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H)
+#include <vis.h>
+#endif
 
 #include "xmalloc.h"
 #include "atomicio.h"
@@ -582,7 +585,7 @@ source(int argc, char **argv)
        off_t i, amt, statbytes;
        size_t result;
        int fd = -1, haderr, indx;
-       char *last, *name, buf[2048];
+       char *last, *name, buf[2048], encname[MAXPATHLEN];
        int len;
 
        for (indx = 0; indx < argc; ++indx) {
@@ -591,13 +594,12 @@ source(int argc, char **argv)
                len = strlen(name);
                while (len > 1 && name[len-1] == '/')
                        name[--len] = '\0';
-               if (strchr(name, '\n') != NULL) {
-                       run_err("%s: skipping, filename contains a newline",
-                           name);
-                       goto next;
-               }
                if ((fd = open(name, O_RDONLY|O_NONBLOCK, 0)) < 0)
                        goto syserr;
+               if (strchr(name, '\n') != NULL) {
+                       strnvis(encname, name, sizeof(encname), VIS_NL);
+                       name = encname;
+               }
                if (fstat(fd, &stb) < 0) {
 syserr:                        run_err("%s: %s", name, strerror(errno));
                        goto next;
This page took 2.237403 seconds and 5 git commands to generate.