Commit 3e1ff8eb authored by Alexander Strasser's avatar Alexander Strasser Committed by Michael Niedermayer

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: 's avatarAlexander Strasser <eclipse7@gmx.net>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 0be130e3
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment