diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index d10a7a4b6a..155f9fc325 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -95,9 +95,19 @@ static int infer_size(int *width_ptr, int *height_ptr, int size) static int is_glob(const char *path) { #if HAVE_GLOB - size_t span = strcspn(path, "*?[]{}\\"); + size_t span = 0; + const char *p = path; + + while (p = strchr(p, '%')) { + if (*(++p) == '%') { + ++p; + continue; + } + if (span = strspn(p, "*?[]{}")) + break; + } /* Did we hit a glob char or get to the end? */ - return path[span] != '\0'; + return span != 0; #else return 0; #endif @@ -222,7 +232,23 @@ static int read_header(AVFormatContext *s1) s->use_glob = is_glob(s->path); if (s->use_glob) { #if HAVE_GLOB + char *p = s->path, *q, *dup; int gerr; + + dup = q = av_strdup(p); + while (*q) { + /* Do we have room for the next char and a \ insertion? */ + if ((p - s->path) >= (sizeof(s->path) - 2)) + break; + if (*q == '%' && strspn(q + 1, "%*?[]{}")) + ++q; + else if (strspn(q, "\\*?[]{}")) + *p++ = '\\'; + *p++ = *q++; + } + *p = 0; + av_free(dup); + gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC|GLOB_TILDE_CHECK, NULL, &s->globstate); if (gerr != 0) { return AVERROR(ENOENT);