diff options
author | Jakub Jelen <jjelen@redhat.com> | 2020-04-29 14:18:59 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2020-05-05 14:23:06 +0200 |
commit | 2e7ca3e8a6e1ae4dddd04d9d68197b2f8f87bf6d (patch) | |
tree | a1fe6e57b39add98a58177856a16b19b05ad49ab | |
parent | b90131dfe696b40b7cc0bc18cdfc307e6d14480a (diff) | |
download | libssh-2e7ca3e8a6e1ae4dddd04d9d68197b2f8f87bf6d.tar.gz libssh-2e7ca3e8a6e1ae4dddd04d9d68197b2f8f87bf6d.tar.xz libssh-2e7ca3e8a6e1ae4dddd04d9d68197b2f8f87bf6d.zip |
options: Properly handle unknown options with arguments
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r-- | src/options.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/options.c b/src/options.c index b5f951ac..f5c7bbb2 100644 --- a/src/options.c +++ b/src/options.c @@ -1217,6 +1217,11 @@ int ssh_options_getopt(ssh_session session, int *argcptr, char **argv) int saveopterr = opterr; int opt; + /* Nothing to do here */ + if (argc <= 1) { + return SSH_OK; + } + opterr = 0; /* shut up getopt */ while((opt = getopt(argc, argv, "c:i:Cl:p:vb:rd12")) != -1) { switch(opt) { @@ -1266,8 +1271,19 @@ int ssh_options_getopt(ssh_session session, int *argcptr, char **argv) return -1; } current++; - if (optarg) { - save[current++] = argv[optind + 1]; + /* We can not use optarg here as getopt does not set it for + * unknown options. We need to manually extract following + * option and skip it manually from further processing */ + if (optind < argc && argv[optind][0] != '-') { + tmp = realloc(save, (current + 1) * sizeof(char*)); + if (tmp == NULL) { + SAFE_FREE(save); + ssh_set_error_oom(session); + return -1; + } + save = tmp; + save[current++] = argv[optind]; + optind++; } } } /* switch */ |