From 8e3a2a64d103a46508e17cde76595993de96ea6c Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sat, 21 Feb 2026 23:16:39 +0100 Subject: [PATCH] tool: improve config error messaging - make sure that errors for specific options in config files identify the file, line number and shows the error about the correct option - improve some error message wording - add warning for leading single quote of arguments in config files (verified in test 1712) - adjust test error outputs accordingly test1712 introduces mode=warn Use the mode="warn" attribute if the output curl warning output, as it then makes the check without newlines and the prefix to better handle that the lines may wrap at different points depending on the lengths of the lines and terminal width. Fixes #20598 Closes #20666 --- docs/tests/FILEFORMAT.md | 6 +++- src/tool_getparam.h | 1 + src/tool_helpers.c | 2 ++ src/tool_parsecfg.c | 17 +++++++---- tests/data/Makefile.am | 2 +- tests/data/test1712 | 61 ++++++++++++++++++++++++++++++++++++++++ tests/data/test459 | 4 +-- tests/runtests.pl | 16 +++++++++++ 8 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 tests/data/test1712 diff --git a/docs/tests/FILEFORMAT.md b/docs/tests/FILEFORMAT.md index 26dae3e23f..b946c7973c 100644 --- a/docs/tests/FILEFORMAT.md +++ b/docs/tests/FILEFORMAT.md @@ -712,12 +712,16 @@ server is used), if `nonewline` is set, we cut off the trailing newline of this given data before comparing with the one actually sent by the client The `` and `` rules are applied before comparisons are made. -### `` +### `` This verifies that this data was passed to stderr. Use the mode="text" attribute if the output is in text mode on platforms that have a text/binary difference. +Use the mode="warn" attribute for curl warning output, as it then makes the +check without newlines and the prefix to better handle that the lines may wrap +at different points depending on the lengths of the lines and terminal width. + `crlf=yes` forces the newlines to become CRLF even if not written so in the test. diff --git a/src/tool_getparam.h b/src/tool_getparam.h index 4d34541393..e3cbe5454a 100644 --- a/src/tool_getparam.h +++ b/src/tool_getparam.h @@ -336,6 +336,7 @@ struct LongShort { typedef enum { PARAM_OK = 0, PARAM_OPTION_UNKNOWN, + PARAM_CONFIG_OPTION_UNKNOWN, PARAM_REQUIRES_PARAMETER, PARAM_BAD_USE, PARAM_HELP_REQUESTED, diff --git a/src/tool_helpers.c b/src/tool_helpers.c index 2a84accf2c..a23c3a80e7 100644 --- a/src/tool_helpers.c +++ b/src/tool_helpers.c @@ -39,6 +39,8 @@ const char *param2text(ParameterError error) return "had unsupported trailing garbage"; case PARAM_OPTION_UNKNOWN: return "is unknown"; + case PARAM_CONFIG_OPTION_UNKNOWN: + return "found an unknown config option"; case PARAM_REQUIRES_PARAMETER: return "requires parameter"; case PARAM_BAD_USE: diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c index 9cecaaa2f4..d5421136c4 100644 --- a/src/tool_parsecfg.c +++ b/src/tool_parsecfg.c @@ -172,6 +172,11 @@ ParameterError parseconfig(const char *filename, int max_recursive, param = curlx_dyn_len(&pbuf) ? curlx_dyn_ptr(&pbuf) : CURL_UNCONST(""); } else { + if(*line == '\'') { + warnf("%s:%d Option '%s' uses argument with leading single quote. " + "It is probably a mistake. Consider double quotes.", + filename, lineno, option); + } param = line; /* parameter starts here */ while(*line && !ISSPACE(*line)) /* stop also on CRLF */ line++; @@ -192,7 +197,7 @@ ParameterError parseconfig(const char *filename, int max_recursive, case '#': /* comment */ break; default: - warnf("%s:%d: warning: '%s' uses unquoted whitespace. " + warnf("%s:%d Option '%s' uses argument with unquoted whitespace. " "This may cause side-effects. Consider double quotes.", filename, lineno, option); } @@ -240,11 +245,11 @@ ParameterError parseconfig(const char *filename, int max_recursive, res != PARAM_VERSION_INFO_REQUESTED && res != PARAM_ENGINES_REQUESTED && res != PARAM_CA_EMBED_REQUESTED) { - /* only show error in the first level config call */ - if(max_recursive == CONFIG_MAX_LEVELS) { - const char *reason = param2text(res); - errorf("%s:%d: '%s' %s", filename, lineno, option, reason); - } + const char *reason = param2text(res); + errorf("%s:%d config file option '%s' %s", + filename, lineno, option, reason); + if(res == PARAM_OPTION_UNKNOWN) + res = PARAM_CONFIG_OPTION_UNKNOWN; err = res; } } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index ca44e3d2b0..ecbcc28fe9 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -229,7 +229,7 @@ test1670 test1671 \ test1680 test1681 test1682 test1683 \ \ test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 \ -test1708 test1709 test1710 test1711 \ +test1708 test1709 test1710 test1711 test1712 \ \ test1800 test1801 test1802 test1847 test1848 \ \ diff --git a/tests/data/test1712 b/tests/data/test1712 new file mode 100644 index 0000000000..5cdc642d09 --- /dev/null +++ b/tests/data/test1712 @@ -0,0 +1,61 @@ + + + + +HTTP +--config + + + +# Server-side + + +HTTP/1.1 200 OK +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 +Connection: close +Content-Type: text/html +Funny-head: yesyes + +-foo- + + + +# Client-side + + +http + + +config file with argument using single quotes + + +data = 'arg-with-quote' + + +http://%HOSTIP:%HTTPPORT/%TESTNUMBER --config %LOGDIR/config --silent + + + +# Verify data after the test has been "shot" + + +POST /%TESTNUMBER HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +User-Agent: curl/%VERSION +Accept: */* +Content-Length: 16 +Content-Type: application/x-www-form-urlencoded + +'arg-with-quote' + + +Warning: %LOGDIR/config:1 Option 'data' uses argument with leading single quote.%SP +It is probably a mistake. Consider double quotes. + + + diff --git a/tests/data/test459 b/tests/data/test459 index 5d62307728..7a2e1db7b3 100644 --- a/tests/data/test459 +++ b/tests/data/test459 @@ -54,8 +54,8 @@ Content-Type: application/x-www-form-urlencoded arg -Warning: %LOGDIR/config:1: warning: 'data' uses unquoted whitespace. This may%SP -Warning: cause side-effects. Consider double quotes. +Warning: %LOGDIR/config:1 Option 'data' uses argument with unquoted whitespace.%SP +Warning: This may cause side-effects. Consider double quotes. diff --git a/tests/runtests.pl b/tests/runtests.pl index e0bc468f10..e8612d2756 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -1346,6 +1346,22 @@ sub singletest_check { normalize_text(\@validstderr); normalize_text(\@actual); } + if($filemode && ($filemode eq "warn")) { + for(@validstderr) { + s/Warning: //; + s/\r//; + s/\n/ /; + } + for(@actual) { + s/Warning: //; + s/\r//; + s/\n/ /; + } + my $v = join(@validstderr, ""); + my $a = join(@actual, ""); + @validstderr = $v; + @actual = $a; + } if($hash{'nonewline'}) { # Yes, we must cut off the final newline from the final line