diff options
author | Damien Miller <djm@mindrot.org> | 2008-02-10 12:26:24 +0100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2008-02-10 12:26:24 +0100 |
commit | aec5cf8a30c1d44a0cc2da939d39d46cd078d602 (patch) | |
tree | 6de351f0dba8acce8c438740835b14a9d1020b00 /sftp.c | |
parent | - djm@cvs.openbsd.org 2008/01/19 23:09:49 (diff) | |
download | openssh-aec5cf8a30c1d44a0cc2da939d39d46cd078d602.tar.xz openssh-aec5cf8a30c1d44a0cc2da939d39d46cd078d602.zip |
- djm@cvs.openbsd.org 2008/01/20 00:38:30
[sftp.c]
When uploading, correctly handle the case of an unquoted filename with
glob metacharacters that match a file exactly but not as a glob, e.g. a
file called "[abcd]". report and test cases from duncan2nd AT gmx.de
Diffstat (limited to '')
-rw-r--r-- | sftp.c | 24 |
1 files changed, 10 insertions, 14 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.98 2007/12/12 05:04:03 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.99 2008/01/20 00:38:30 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> * @@ -434,17 +434,6 @@ is_dir(char *path) } static int -is_reg(char *path) -{ - struct stat sb; - - if (stat(path, &sb) == -1) - fatal("stat %s: %s", path, strerror(errno)); - - return(S_ISREG(sb.st_mode)); -} - -static int remote_is_dir(struct sftp_conn *conn, char *path) { Attrib *a; @@ -532,6 +521,7 @@ process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag) glob_t g; int err = 0; int i; + struct stat sb; if (dst) { tmp_dst = xstrdup(dst); @@ -540,7 +530,7 @@ process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag) memset(&g, 0, sizeof(g)); debug3("Looking up %s", src); - if (glob(src, 0, NULL, &g)) { + if (glob(src, GLOB_NOCHECK, NULL, &g)) { error("File \"%s\" not found.", src); err = -1; goto out; @@ -555,7 +545,13 @@ process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag) } for (i = 0; g.gl_pathv[i] && !interrupted; i++) { - if (!is_reg(g.gl_pathv[i])) { + if (stat(g.gl_pathv[i], &sb) == -1) { + err = -1; + error("stat %s: %s", g.gl_pathv[i], strerror(errno)); + continue; + } + + if (!S_ISREG(sb.st_mode)) { error("skipping non-regular file %s", g.gl_pathv[i]); continue; |