From ee18acce0a26b447438738fd365a1873b4a776d4 Mon Sep 17 00:00:00 2001 From: hniksic Date: Sun, 8 May 2005 10:52:26 -0700 Subject: [PATCH] [svn] Check for wildcards in unescaped URL path. --- src/ChangeLog | 9 +++++++++ src/ftp.c | 18 ++++++++++++++---- src/http.c | 6 ++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3fcc019f..cd462989 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2005-05-08 Hrvoje Niksic + + * http.c (http_loop): Check for wildcards in the URL path + component, not in the whole URL. + + * ftp.c (ftp_loop): Check for wildcards in URL path before + unescaping, so the users can escape globbing metacharacters with % + escapes. + 2005-05-08 Hrvoje Niksic * init.c (run_command): Correctly interpret the return value of diff --git a/src/ftp.c b/src/ftp.c index 9a77fc10..4ec30a4a 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -1850,15 +1850,25 @@ ftp_loop (struct url *u, int *dt, struct url *proxy) } else { - int wild = has_wildcards_p (u->file); - if ((opt.ftp_glob && wild) || opt.recursive || opt.timestamping) + int ispattern = 0; + if (opt.ftp_glob) + { + /* Treat the URL as a pattern if the file name part of the + URL path contains wildcards. (Don't check for u->file + because it is unescaped and therefore doesn't leave users + the option to escape literal '*' as %2A.) */ + char *file_part = strrchr (u->path, '/'); + if (!file_part) + file_part = u->path; + ispattern = has_wildcards_p (file_part); + } + if (ispattern || opt.recursive || opt.timestamping) { /* ftp_retrieve_glob is a catch-all function that gets called if we need globbing, time-stamping or recursion. Its third argument is just what we really need. */ res = ftp_retrieve_glob (u, &con, - (opt.ftp_glob && wild) - ? GLOB_GLOBALL : GLOB_GETONE); + ispattern ? GLOB_GLOBALL : GLOB_GETONE); } else res = ftp_loop_internal (u, NULL, &con); diff --git a/src/http.c b/src/http.c index b7580335..d3fc1c3e 100644 --- a/src/http.c +++ b/src/http.c @@ -2004,10 +2004,8 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer, *newloc = NULL; - /* Warn on (likely bogus) wildcard usage in HTTP. Don't use - has_wildcards_p because it would also warn on `?', and we know that - shows up in CGI paths a *lot*. */ - if (strchr (u->url, '*')) + /* Warn on (likely bogus) wildcard usage in HTTP. */ + if (has_wildcards_p (u->path)) logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n")); xzero (hstat);