globbing: curl glob counter mismatch with {} list use

The "fixed string" function wrongly bumped the "urlnum" counter which
made curl output the total number of URLs wrong when using
{one,two,three} lists in globs.

Reported-by: Michael-O
Bug: http://curl.haxx.se/bug/view.cgi?id=1305
This commit is contained in:
Daniel Stenberg 2013-11-28 23:31:31 +01:00
Родитель 889cb9c982
Коммит 0dd6522036
1 изменённых файлов: 4 добавлений и 8 удалений

Просмотреть файл

@ -40,8 +40,7 @@ typedef enum {
void glob_cleanup(URLGlob* glob); void glob_cleanup(URLGlob* glob);
static GlobCode glob_fixed(URLGlob *glob, unsigned long *amount, static GlobCode glob_fixed(URLGlob *glob, char *fixed, size_t len)
char *fixed, size_t len)
{ {
URLPattern *pat = &glob->pattern[glob->size]; URLPattern *pat = &glob->pattern[glob->size];
pat->type = UPTSet; pat->type = UPTSet;
@ -49,8 +48,6 @@ static GlobCode glob_fixed(URLGlob *glob, unsigned long *amount,
pat->content.Set.ptr_s = 0; pat->content.Set.ptr_s = 0;
pat->globindex = -1; pat->globindex = -1;
(*amount)++;
pat->content.Set.elements = malloc(sizeof(char*)); pat->content.Set.elements = malloc(sizeof(char*));
if(!pat->content.Set.elements) if(!pat->content.Set.elements)
@ -314,6 +311,8 @@ static GlobCode glob_parse(URLGlob *glob, char *pattern,
GlobCode res = GLOB_OK; GlobCode res = GLOB_OK;
int globindex = 0; /* count "actual" globs */ int globindex = 0; /* count "actual" globs */
*amount = 1;
while(*pattern && !res) { while(*pattern && !res) {
char *buf = glob->glob_buffer; char *buf = glob->glob_buffer;
int sublen = 0; int sublen = 0;
@ -337,12 +336,9 @@ static GlobCode glob_parse(URLGlob *glob, char *pattern,
if(sublen) { if(sublen) {
/* we got a literal string, add it as a single-item list */ /* we got a literal string, add it as a single-item list */
*buf = '\0'; *buf = '\0';
res = glob_fixed(glob, amount, glob->glob_buffer, sublen); res = glob_fixed(glob, glob->glob_buffer, sublen);
} }
else { else {
if(!*amount)
*amount = 1;
switch (*pattern) { switch (*pattern) {
case '\0': /* done */ case '\0': /* done */
break; break;