From 3e1ff8eb27e547c330af72ec87ca75a951d64c24 Mon Sep 17 00:00:00 2001 From: Alexander Strasser Date: Sun, 11 Mar 2012 15:24:51 +0100 Subject: [PATCH] img2dec: Recognize glob meta chars only if prefixed by % This changes globbing support to only be used if the character contains at least one glob meta character that is preceded by an unescaped %. To escape a literal % one would use %% which is identical to the way to match a % with image2 sequence generation feature. * Makes it possible to have patterns like %04d-[720p].jpg work again with sequence number generation. Previously this would always be detected as a glob pattern and was interpreted by the image2 glob code instead. * Makes it possible to use %*-[720p].jpg to match above pattern without having to double escape it to be not interpreted by most shells and not by the image2 glob code (previously one would need to use \*-\\\[720p\\\].jpg to achieve the same) Signed-off-by: Alexander Strasser Signed-off-by: Michael Niedermayer --- libavformat/img2dec.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) 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);