aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Strasser <eclipse7@gmx.net>2012-03-11 15:24:51 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-03-30 00:04:16 +0200
commit3e1ff8eb27e547c330af72ec87ca75a951d64c24 (patch)
treea9ea493ac99464c0a1846319666677ee1123f500
parent0be130e37bfafd6022edd27833f04a0b6cee2f02 (diff)
downloadffmpeg-3e1ff8eb27e547c330af72ec87ca75a951d64c24.tar.gz
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 <eclipse7@gmx.net> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/img2dec.c30
1 files 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);