From d14ecfe587efbe80e5534161dbd3a4f7158b4e2b Mon Sep 17 00:00:00 2001 From: Lubos Kardos Date: Mon, 27 Jul 2015 11:22:19 +0200 Subject: [PATCH] Enable {} expansion in rpmGlob() (rhbz:1246743) --- rpmio/rpmglob.c | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/rpmio/rpmglob.c b/rpmio/rpmglob.c index 4fc106d..597ac5c 100644 --- a/rpmio/rpmglob.c +++ b/rpmio/rpmglob.c @@ -150,7 +150,7 @@ static inline const char *next_brace_sub(const char *begin) return cp; } -static int __glob_pattern_p(const char *pattern, int quote); +static int __glob_pattern_p(const char *pattern, int flags); /* Do glob searching for PATTERN, placing results in PGLOB. The bits defined above may be set in FLAGS. @@ -419,7 +419,7 @@ glob(const char *pattern, int flags, return GLOB_NOMATCH; } - if (__glob_pattern_p(dirname, !(flags & GLOB_NOESCAPE))) { + if (__glob_pattern_p(dirname, flags)) { /* The directory name contains metacharacters, so we have to glob for the directory, and then glob for the pattern in each directory found. */ @@ -646,10 +646,11 @@ static int prefix_array(const char *dirname, char **array, size_t n) /* Return nonzero if PATTERN contains any metacharacters. Metacharacters can be quoted with backslashes if QUOTE is nonzero. */ -static int __glob_pattern_p(const char *pattern, int quote) +static int __glob_pattern_p(const char *pattern, int flags) { register const char *p; - int open = 0; + int openBrackets = 0; + int openBraces = 0; for (p = pattern; *p != '\0'; ++p) switch (*p) { @@ -658,18 +659,29 @@ static int __glob_pattern_p(const char *pattern, int quote) return 1; case '\\': - if (quote && p[1] != '\0') + if (!(flags & GLOB_NOESCAPE) && p[1] != '\0') ++p; break; case '[': - open = 1; + openBrackets = 1; break; case ']': - if (open) + if (openBrackets) return 1; break; + + case '{': + if (flags & GLOB_BRACE) + openBraces = 1; + break; + + case '}': + if (openBraces) + return 1; + break; + } return 0; @@ -694,7 +706,7 @@ glob_in_dir(const char *pattern, const char *directory, int flags, int meta; int save; - meta = __glob_pattern_p(pattern, !(flags & GLOB_NOESCAPE)); + meta = __glob_pattern_p(pattern, flags); if (meta == 0) { if (flags & (GLOB_NOCHECK | GLOB_NOMAGIC)) /* We need not do any tests. The PATTERN contains no meta @@ -844,6 +856,8 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr) int i, j; int rc; + gflags |= GLOB_BRACE; + if (home != NULL && strlen(home) > 0) gflags |= GLOB_TILDE; @@ -874,7 +888,9 @@ int rpmGlob(const char * patterns, int * argcPtr, ARGV_t * argvPtr) int dir_only = (plen > 0 && path[plen-1] == '/'); glob_t gl; - if (!local || (!rpmIsGlob(av[j], 0) && strchr(path, '~') == NULL)) { + if (!local || (!rpmIsGlob(av[j], GLOB_NOESCAPE | flags) && + strchr(path, '~') == NULL)) { + argvAdd(&argv, av[j]); continue; } @@ -966,5 +982,11 @@ exit: int rpmIsGlob(const char * pattern, int quote) { - return __glob_pattern_p(pattern, quote); + int flags = 0; + if (!quote) { + flags |= GLOB_NOESCAPE; + } + flags |= GLOB_BRACE; + + return __glob_pattern_p(pattern, flags); } -- 1.9.3