summaryrefslogtreecommitdiffstats
path: root/sftp.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2013-08-20 18:41:46 +0200
committerDamien Miller <djm@mindrot.org>2013-08-20 18:41:46 +0200
commit036d30743fc914089f9849ca52d615891d47e616 (patch)
treec2dada7bd0a723e96e697ed30f8dd450a3998577 /sftp.c
parent - djm@cvs.openbsd.org 2013/08/08 05:04:03 (diff)
downloadopenssh-036d30743fc914089f9849ca52d615891d47e616.tar.xz
openssh-036d30743fc914089f9849ca52d615891d47e616.zip
- djm@cvs.openbsd.org 2013/08/09 03:37:25
[sftp.c] do getopt parsing for all sftp commands (with an empty optstring for commands without arguments) to ensure consistent behaviour
Diffstat (limited to 'sftp.c')
-rw-r--r--sftp.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/sftp.c b/sftp.c
index 66ab2b0d4..1ddfef6b5 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp.c,v 1.152 2013/08/08 05:04:03 djm Exp $ */
+/* $OpenBSD: sftp.c,v 1.153 2013/08/09 03:37:25 djm Exp $ */
/*
* Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
*
@@ -519,6 +519,26 @@ parse_df_flags(const char *cmd, char **argv, int argc, int *hflag, int *iflag)
}
static int
+parse_no_flags(const char *cmd, char **argv, int argc)
+{
+ extern int opterr, optind, optopt, optreset;
+ int ch;
+
+ optind = optreset = 1;
+ opterr = 0;
+
+ while ((ch = getopt(argc, argv, "")) != -1) {
+ switch (ch) {
+ default:
+ error("%s: Invalid flag -%c", cmd, optopt);
+ return -1;
+ }
+ }
+
+ return optind;
+}
+
+static int
is_dir(char *path)
{
struct stat sb;
@@ -1240,6 +1260,8 @@ parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag,
return -1;
goto parse_two_paths;
case I_SYMLINK:
+ if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
+ return -1;
parse_two_paths:
if (argc - optidx < 2) {
error("You must specify two paths after a %s "
@@ -1258,6 +1280,8 @@ parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag,
case I_CHDIR:
case I_LCHDIR:
case I_LMKDIR:
+ if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
+ return -1;
/* Get pathname (mandatory) */
if (argc - optidx < 1) {
error("You must specify a path after a %s command.",
@@ -1299,6 +1323,8 @@ parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag,
base = 8;
case I_CHOWN:
case I_CHGRP:
+ if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
+ return -1;
/* Get numeric arg (mandatory) */
if (argc - optidx < 1)
goto need_num_arg;
@@ -1329,6 +1355,8 @@ parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag,
case I_HELP:
case I_VERSION:
case I_PROGRESS:
+ if ((optidx = parse_no_flags(cmd, argv, argc)) == -1)
+ return -1;
break;
default:
fatal("Command not implemented");