From 31b77c1877a807ab6184b22ab2310e096536b9b5 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 20 May 2019 10:51:53 +0200 Subject: [PATCH] curl: report error for "--no-" on non-boolean options Reported-by: Olen Andoni Fixes #3906 Closes #3907 --- src/tool_getparam.c | 5 +++++ src/tool_getparam.h | 3 ++- src/tool_helpers.c | 4 +++- tests/data/Makefile.inc | 2 +- tests/data/test333 | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 tests/data/test333 diff --git a/src/tool_getparam.c b/src/tool_getparam.c index b133cb87e..b347121f8 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -515,11 +515,13 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ const char *word = ('-' == flag[0]) ? flag + 2 : flag; size_t fnam = strlen(word); int numhits = 0; + bool noflagged = FALSE; if(!strncmp(word, "no-", 3)) { /* disable this option but ignore the "no-" part when looking for it */ word += 3; toggle = FALSE; + noflagged = TRUE; } for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) { @@ -543,6 +545,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ if(hit < 0) { return PARAM_OPTION_UNKNOWN; } + if(noflagged && (aliases[hit].desc != ARG_BOOL)) + /* --no- prefixed an option that isn't boolean! */ + return PARAM_NO_NOT_BOOLEAN; } else { flag++; /* prefixed with one dash, pass it */ diff --git a/src/tool_getparam.h b/src/tool_getparam.h index daf83b884..f6fcd5a35 100644 --- a/src/tool_getparam.h +++ b/src/tool_getparam.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -42,6 +42,7 @@ typedef enum { PARAM_NEXT_OPERATION, PARAM_NO_PREFIX, PARAM_NUMBER_TOO_LARGE, + PARAM_NO_NOT_BOOLEAN, PARAM_LAST } ParameterError; diff --git a/src/tool_helpers.c b/src/tool_helpers.c index b3a9516a8..61788b7f8 100644 --- a/src/tool_helpers.c +++ b/src/tool_helpers.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -66,6 +66,8 @@ const char *param2text(int res) return "the given option can't be reversed with a --no- prefix"; case PARAM_NUMBER_TOO_LARGE: return "too large number"; + case PARAM_NO_NOT_BOOLEAN: + return "used '--no-' for option that isn't a boolean"; default: return "unknown error"; } diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 9b26b1e0a..afea1fb83 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -56,7 +56,7 @@ test289 test290 test291 test292 test293 test294 test295 test296 test297 \ test298 test299 test300 test301 test302 test303 test304 test305 test306 \ test307 test308 test309 test310 test311 test312 test313 test314 test315 \ test316 test317 test318 test319 test320 test321 test322 test323 test324 \ -test325 test326 test327 test328 test329 test330 test331 test332 \ +test325 test326 test327 test328 test329 test330 test331 test332 test333 \ \ test340 \ \ diff --git a/tests/data/test333 b/tests/data/test333 new file mode 100644 index 000000000..198af9c86 --- /dev/null +++ b/tests/data/test333 @@ -0,0 +1,35 @@ + + + +command-line + + + +# +# Server-side + + + +# +# Client-side + + +none + + +Try a non-boolean command line option with --no- + + +--no-proxy "hey" http://%HOSTIP:%HTTPPORT/333 + + + +# +# Verify data after the test has been "shot" + +# detected the bad --no- prefix + +2 + + +