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

Fixes #20598
Closes #20666
This commit is contained in:
Daniel Stenberg 2026-02-21 23:16:39 +01:00
parent 9ce9afa312
commit 4c5a9208f5
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 78 additions and 9 deletions

View file

@ -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,

View file

@ -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:

View file

@ -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;
}
}

View file

@ -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 \
\

61
tests/data/test1712 Normal file
View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="US-ASCII"?>
<testcase>
<info>
<keywords>
HTTP
--config
</keywords>
</info>
# Server-side
<reply>
<data crlf="headers">
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-
</data>
</reply>
# Client-side
<client>
<server>
http
</server>
<name>
config file with argument using single quotes
</name>
<file name="%LOGDIR/config">
data = 'arg-with-quote'
</file>
<command>
http://%HOSTIP:%HTTPPORT/%TESTNUMBER --config %LOGDIR/config --silent
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<protocol crlf="yes" nonewline="yes">
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'
</protocol>
<stderr mode="text">
Warning: %LOGDIR/config:1 Option 'data' uses argument with leading single quote.%SP
Warning: It is probably a mistake. Consider double quotes.
</stderr>
</verify>
</testcase>

View file

@ -54,8 +54,8 @@ Content-Type: application/x-www-form-urlencoded
arg
</protocol>
<stderr mode="text">
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.
</stderr>
</verify>
</testcase>