glob: backslash escaping bug

curl didn't properly handle escaping characters in a URL with the use of
backslash. It did an attempt, but that failed as reported in bug
3022551. The described example was using the URL
"http://example.com?{AB,C\,D}".

I've now removed the special-handling of letters following the backslash
and I also removed the bad extra check that triggered this particular
bug.

Bug: http://curl.haxx.se/bug/view.cgi?id=3022551
Reported by: Jon Sargeant
This commit is contained in:
Daniel Stenberg 2010-06-29 00:17:38 +02:00
parent bcefe839c7
commit 89924a897d
2 changed files with 4 additions and 21 deletions

View File

@ -20,6 +20,7 @@ This release includes the following bugfixes:
o ftp-wildcard: avoid tight loop when used without any pattern
o multi_socket: re-use of same socket without notifying app
o ftp wildcard: FTP LIST parser FIX
o urlglobbing backslash escaping bug
This release includes the following known bugs:
@ -29,6 +30,7 @@ This release would not have looked like this without help, code, reports and
advice from friends like these:
Dan Fandrich, Kamil Dudka, Krister Johansen, Pavel Raiskup,
Jon Sargeant
Thanks! (and sorry if I forgot to mention someone)

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@ -75,8 +75,6 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
++glob->size;
while (!done) {
bool skip;
switch (*pattern) {
case '\0': /* URL ended while set was still open */
snprintf(glob->errormsg, sizeof(glob->errormsg),
@ -127,24 +125,7 @@ static GlobCode glob_set(URLGlob *glob, char *pattern,
return GLOB_ERROR;
case '\\': /* escaped character, skip '\' */
switch(pattern[1]) {
case '[':
case ']':
case '{':
case '}':
case ',':
skip = TRUE;
break;
default:
skip = FALSE;
break;
}
if(skip) {
if (*(buf+1) == '\0') { /* but no escaping of '\0'! */
snprintf(glob->errormsg, sizeof(glob->errormsg),
"illegal pattern at pos %zu\n", pos);
return GLOB_ERROR;
}
if(pattern[1]) {
++pattern;
++pos;
}