- If globbing of a filename fails, try use the filename without globbing.
- Related: #1246743 - Modify rpmIsGlob() to be more precise and compatible with glob(). - Related: #1246743
This commit is contained in:
parent
977533abf2
commit
ad8c4238ac
136
rpm-4.12.90-modify-rpmisglob.patch
Normal file
136
rpm-4.12.90-modify-rpmisglob.patch
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
From 630a0970df46df6cc96a68349cf4e08d8b4ca772 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lubos Kardos <lkardos@redhat.com>
|
||||||
|
Date: Mon, 3 Aug 2015 16:51:11 +0200
|
||||||
|
Subject: [PATCH 1/2] Modify rpmIsGlob() to be more precise.
|
||||||
|
|
||||||
|
Now rpmIsGlob() checks if braces expansion pattern is well formed and
|
||||||
|
not only if it contains opening and closing brace. The checking
|
||||||
|
procedure is same as procedure in glob() so rpmIsGlob() and glob() are
|
||||||
|
now compatible.
|
||||||
|
---
|
||||||
|
rpmio/rpmglob.c | 57 ++++++++++++++++++++++++++++++++-------------------------
|
||||||
|
1 file changed, 32 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/rpmio/rpmglob.c b/rpmio/rpmglob.c
|
||||||
|
index 597ac5c..0c6b0a3 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 flags);
|
||||||
|
+static int __glob_pattern_p(const char *pattern, int quote);
|
||||||
|
|
||||||
|
/* 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)) {
|
||||||
|
+ if (__glob_pattern_p(dirname, !(flags & GLOB_NOESCAPE))) {
|
||||||
|
/* The directory name contains metacharacters, so we
|
||||||
|
have to glob for the directory, and then glob for
|
||||||
|
the pattern in each directory found. */
|
||||||
|
@@ -646,11 +646,10 @@ 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 flags)
|
||||||
|
+static int __glob_pattern_p(const char *pattern, int quote)
|
||||||
|
{
|
||||||
|
register const char *p;
|
||||||
|
int openBrackets = 0;
|
||||||
|
- int openBraces = 0;
|
||||||
|
|
||||||
|
for (p = pattern; *p != '\0'; ++p)
|
||||||
|
switch (*p) {
|
||||||
|
@@ -659,7 +658,7 @@ static int __glob_pattern_p(const char *pattern, int flags)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
- if (!(flags & GLOB_NOESCAPE) && p[1] != '\0')
|
||||||
|
+ if (quote && p[1] != '\0')
|
||||||
|
++p;
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -671,17 +670,6 @@ static int __glob_pattern_p(const char *pattern, int flags)
|
||||||
|
if (openBrackets)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
-
|
||||||
|
- case '{':
|
||||||
|
- if (flags & GLOB_BRACE)
|
||||||
|
- openBraces = 1;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case '}':
|
||||||
|
- if (openBraces)
|
||||||
|
- return 1;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -706,7 +694,7 @@ glob_in_dir(const char *pattern, const char *directory, int flags,
|
||||||
|
int meta;
|
||||||
|
int save;
|
||||||
|
|
||||||
|
- meta = __glob_pattern_p(pattern, flags);
|
||||||
|
+ meta = __glob_pattern_p(pattern, !(flags & GLOB_NOESCAPE));
|
||||||
|
if (meta == 0) {
|
||||||
|
if (flags & (GLOB_NOCHECK | GLOB_NOMAGIC))
|
||||||
|
/* We need not do any tests. The PATTERN contains no meta
|
||||||
|
@@ -888,9 +876,7 @@ 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], GLOB_NOESCAPE | flags) &&
|
||||||
|
- strchr(path, '~') == NULL)) {
|
||||||
|
-
|
||||||
|
+ if (!local || (!rpmIsGlob(av[j], 0) && strchr(path, '~') == NULL)) {
|
||||||
|
argvAdd(&argv, av[j]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -982,11 +968,32 @@ exit:
|
||||||
|
|
||||||
|
int rpmIsGlob(const char * pattern, int quote)
|
||||||
|
{
|
||||||
|
- int flags = 0;
|
||||||
|
- if (!quote) {
|
||||||
|
- flags |= GLOB_NOESCAPE;
|
||||||
|
+ if(!__glob_pattern_p(pattern, quote)) {
|
||||||
|
+
|
||||||
|
+ const char *begin;
|
||||||
|
+ const char *next;
|
||||||
|
+ const char *rest;
|
||||||
|
+
|
||||||
|
+ begin = strchr(pattern, '{');
|
||||||
|
+ if (begin == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+ /*
|
||||||
|
+ * Find the first sub-pattern and at the same time find the
|
||||||
|
+ * rest after the closing brace.
|
||||||
|
+ */
|
||||||
|
+ next = next_brace_sub(begin + 1);
|
||||||
|
+ if (next == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* Now find the end of the whole brace expression. */
|
||||||
|
+ rest = next;
|
||||||
|
+ while (*rest != '}') {
|
||||||
|
+ rest = next_brace_sub(rest + 1);
|
||||||
|
+ if (rest == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ /* Now we can be sure that brace expression is well-foermed. */
|
||||||
|
}
|
||||||
|
- flags |= GLOB_BRACE;
|
||||||
|
|
||||||
|
- return __glob_pattern_p(pattern, flags);
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
45
rpm-4.12.90-try-unglobbed.patch
Normal file
45
rpm-4.12.90-try-unglobbed.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From c16c70cbd6b31cd93541d5c22d23ba98d212ad3d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lubos Kardos <lkardos@redhat.com>
|
||||||
|
Date: Mon, 3 Aug 2015 12:10:14 +0200
|
||||||
|
Subject: [PATCH 2/2] If globbing of a filename fails, try use the filename
|
||||||
|
without globbing.
|
||||||
|
|
||||||
|
Commit d14ecfe587efbe80e5534161dbd3a4f7158b4e2b enabled {} expansion
|
||||||
|
but {} expansion caused regresion because rpm tried to expand filenames
|
||||||
|
which weren't expanded previously and expansion failed because these
|
||||||
|
filenames weren't supposed to be expanded. Now if expansion fails then
|
||||||
|
rpm tries to use original filename.
|
||||||
|
---
|
||||||
|
build/files.c | 15 ++++++---------
|
||||||
|
1 file changed, 6 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/build/files.c b/build/files.c
|
||||||
|
index d16bb17..ea595b9 100644
|
||||||
|
--- a/build/files.c
|
||||||
|
+++ b/build/files.c
|
||||||
|
@@ -1584,16 +1584,13 @@ static rpmRC processBinaryFile(Package pkg, FileList fl, const char * fileName)
|
||||||
|
}
|
||||||
|
argvFree(argv);
|
||||||
|
} else {
|
||||||
|
- int lvl = RPMLOG_WARNING;
|
||||||
|
const char *msg = (fl->cur.isDir) ?
|
||||||
|
- _("Directory not found by glob: %s\n") :
|
||||||
|
- _("File not found by glob: %s\n");
|
||||||
|
- if (!(fl->cur.attrFlags & RPMFILE_EXCLUDE)) {
|
||||||
|
- lvl = RPMLOG_ERR;
|
||||||
|
- rc = RPMRC_FAIL;
|
||||||
|
- }
|
||||||
|
- rpmlog(lvl, msg, diskPath);
|
||||||
|
- goto exit;
|
||||||
|
+ _("Directory not found by glob: %s. "
|
||||||
|
+ "Trying without globbing.\n") :
|
||||||
|
+ _("File not found by glob: %s. "
|
||||||
|
+ "Trying without globbing.\n");
|
||||||
|
+ rpmlog(RPMLOG_DEBUG, msg, diskPath);
|
||||||
|
+ rc = addFile(fl, diskPath, NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rc = addFile(fl, diskPath, NULL);
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
10
rpm.spec
10
rpm.spec
@ -27,7 +27,7 @@
|
|||||||
Summary: The RPM package management system
|
Summary: The RPM package management system
|
||||||
Name: rpm
|
Name: rpm
|
||||||
Version: %{rpmver}
|
Version: %{rpmver}
|
||||||
Release: %{?snapver:0.%{snapver}.}4%{?dist}
|
Release: %{?snapver:0.%{snapver}.}5%{?dist}
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Url: http://www.rpm.org/
|
Url: http://www.rpm.org/
|
||||||
Source0: http://rpm.org/releases/rpm-4.12.x/%{name}-%{srcver}.tar.bz2
|
Source0: http://rpm.org/releases/rpm-4.12.x/%{name}-%{srcver}.tar.bz2
|
||||||
@ -53,6 +53,8 @@ Patch5: rpm-4.12.0-rpm2cpio-hack.patch
|
|||||||
Patch100: rpm-4.12.90-braces-expansion.patch
|
Patch100: rpm-4.12.90-braces-expansion.patch
|
||||||
Patch101: rpm-4.12.90-Fix-compressed-patches.patch
|
Patch101: rpm-4.12.90-Fix-compressed-patches.patch
|
||||||
Patch102: rpm-4.12.90-fix-macro-warning.patch
|
Patch102: rpm-4.12.90-fix-macro-warning.patch
|
||||||
|
Patch103: rpm-4.12.90-modify-rpmisglob.patch
|
||||||
|
Patch104: rpm-4.12.90-try-unglobbed.patch
|
||||||
|
|
||||||
# These are not yet upstream
|
# These are not yet upstream
|
||||||
Patch302: rpm-4.7.1-geode-i686.patch
|
Patch302: rpm-4.7.1-geode-i686.patch
|
||||||
@ -537,6 +539,12 @@ exit 0
|
|||||||
%doc doc/librpm/html/*
|
%doc doc/librpm/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Aug 03 2015 Lubos Kardos <lkardos@redhat.com> - 4.12.90-5
|
||||||
|
- If globbing of a filename fails, try use the filename without globbing.
|
||||||
|
(#1246743)
|
||||||
|
- Modify rpmIsGlob() to be more precise and compatible with glob().
|
||||||
|
(#1246743)
|
||||||
|
|
||||||
* Thu Jul 30 2015 Lubos Kardos <lkardos@redhat.com> - 4.12.90-4
|
* Thu Jul 30 2015 Lubos Kardos <lkardos@redhat.com> - 4.12.90-4
|
||||||
- Don't warn when an escaped macro is in a comment (#1224660)
|
- Don't warn when an escaped macro is in a comment (#1224660)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user