From 764e4f066d5719e68fa0d6b0b0d9efa0625c5c15 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 2 Jan 2022 22:23:34 +0100 Subject: [PATCH] tool_findfile: check ~/.config/curlrc too ... after the initial checks for .curlrc and if XDG_CONFIG_HOME is not set, use $HOME and $CURL_HOME to check if ~/.config/curlrc is present. Add test 436 to verify Reported-by: Sandro Jaeckel Fixes #8208 Closes #8213 --- src/tool_findfile.c | 41 +++++++++++++++++++++-------- src/tool_findfile.h | 10 +++++-- src/tool_parsecfg.c | 9 ++----- tests/data/Makefile.inc | 2 +- tests/data/test436 | 58 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 tests/data/test436 diff --git a/src/tool_findfile.c b/src/tool_findfile.c index cda8c8ed8d..766586f695 100644 --- a/src/tool_findfile.c +++ b/src/tool_findfile.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2022, 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,18 +42,25 @@ struct finder { const char *env; const char *append; + bool withoutdot; }; +/* The order of the variables below is important, as the index number is used + in the findfile() function */ static const struct finder list[] = { - { "CURL_HOME", NULL }, - { "XDG_CONFIG_HOME", NULL }, - { "HOME", NULL }, + { "CURL_HOME", NULL, FALSE }, + { "XDG_CONFIG_HOME", NULL, FALSE }, /* index == 1, used in the code */ + { "HOME", NULL, FALSE }, #ifdef WIN32 - { "USERPROFILE", NULL }, - { "APPDATA", NULL }, - { "USERPROFILE", "\\Application Data"}, + { "USERPROFILE", NULL, FALSE }, + { "APPDATA", NULL, FALSE }, + { "USERPROFILE", "\\Application Data", FALSE}, #endif - { NULL, NULL } + /* these are for .curlrc if XDG_CONFIG_HOME is not defined */ + { "CURL_HOME", "/.config", TRUE }, + { "HOME", "/.config", TRUE }, + + { NULL, NULL, FALSE } }; static char *checkhome(const char *home, const char *fname, bool dotscore) @@ -90,11 +97,12 @@ static char *checkhome(const char *home, const char *fname, bool dotscore) * the given file to be accessed there, then it is a match. * 2. Non-windows: try getpwuid */ -char *findfile(const char *fname, bool dotscore) +char *findfile(const char *fname, int dotscore) { int i; + bool xdg = FALSE; DEBUGASSERT(fname && fname[0]); - DEBUGASSERT(!dotscore || (fname[0] == '.')); + DEBUGASSERT((dotscore != 1) || (fname[0] == '.')); if(!fname[0]) return NULL; @@ -103,6 +111,9 @@ char *findfile(const char *fname, bool dotscore) char *home = curl_getenv(list[i].env); if(home) { char *path; + const char *filename = fname; + if(i == 1 /* XDG_CONFIG_HOME */) + xdg = TRUE; if(!home[0]) { curl_free(home); continue; @@ -114,7 +125,15 @@ char *findfile(const char *fname, bool dotscore) return NULL; home = c; } - path = checkhome(home, fname, dotscore); + if(list[i].withoutdot) { + if(!dotscore || xdg) + /* this is not looking for .curlrc, or the XDG_CONFIG_HOME was + defined so we skip the extended check */ + continue; + filename++; /* move past the leading dot */ + dotscore = 0; /* disable it for this check */ + } + path = checkhome(home, filename, dotscore ? dotscore - 1 : 0); curl_free(home); if(path) return path; diff --git a/src/tool_findfile.h b/src/tool_findfile.h index 0f6a8eb55b..412390867f 100644 --- a/src/tool_findfile.h +++ b/src/tool_findfile.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2022, 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 @@ -23,6 +23,12 @@ ***************************************************************************/ #include "tool_setup.h" -char *findfile(const char *fname, bool dotscore); +#ifdef WIN32 +#define CURLRC_DOTSCORE 2 /* look for underscore-prefixed name too */ +#else +#define CURLRC_DOTSCORE 1 /* regular .curlrc check */ +#endif + +char *findfile(const char *fname, int dotscore); #endif /* HEADER_CURL_TOOL_HOMEDIR_H */ diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c index ddb345c6d8..3630ceca89 100644 --- a/src/tool_parsecfg.c +++ b/src/tool_parsecfg.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2022, 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 @@ -84,15 +84,10 @@ int parseconfig(const char *filename, struct GlobalConfig *global) int rc = 0; struct OperationConfig *operation = global->last; char *pathalloc = NULL; -#ifdef WIN32 -#define DOTSCORE TRUE /* look for underscore-prefixed name too */ -#else -#define DOTSCORE FALSE -#endif if(!filename) { /* NULL means load .curlrc from homedir! */ - char *curlrc = findfile(".curlrc", DOTSCORE); + char *curlrc = findfile(".curlrc", CURLRC_DOTSCORE); if(curlrc) { file = fopen(curlrc, FOPEN_READTEXT); if(!file) { diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 8ac53b06df..6a12afe385 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -68,7 +68,7 @@ test392 test393 test394 test395 test396 test397 \ test400 test401 test402 test403 test404 test405 test406 test407 test408 \ test409 test410 \ \ -test430 test431 test432 test433 test434 test435 \ +test430 test431 test432 test433 test434 test435 test436 \ \ test490 test491 test492 test493 test494 \ \ diff --git a/tests/data/test436 b/tests/data/test436 new file mode 100644 index 0000000000..0a62cfb97f --- /dev/null +++ b/tests/data/test436 @@ -0,0 +1,58 @@ + + + +--config + + + +# +# Server-side + + +HTTP/1.1 200 OK +Content-Length: 6 +Content-Type: text/1 + +-foo- + + + +# +# Client-side + + +--next +header = "a: a" +data = "curlrc read" + + +http + + +CURL_HOME=%PWD/log +XDG_CONFIG_HOME= + + +Find .curlrc in .config/curlrc via CURL_HOME + + +%HOSTIP:%HTTPPORT/%TESTNUMBER + + + +# +# Verify data after the test has been "shot" + + +POST /%TESTNUMBER HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +User-Agent: curl/%VERSION +Accept: */* +a: a +Content-Length: 11 +Content-Type: application/x-www-form-urlencoded + +curlrc read + + + -- 2.47.3