summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/cacheset.cc7
-rw-r--r--apt-private/private-list.cc9
-rwxr-xr-xtest/integration/test-apt-patterns34
3 files changed, 44 insertions, 6 deletions
diff --git a/apt-pkg/cacheset.cc b/apt-pkg/cacheset.cc
index 288180f16..3967ba980 100644
--- a/apt-pkg/cacheset.cc
+++ b/apt-pkg/cacheset.cc
@@ -189,8 +189,11 @@ bool CacheSetHelper::PackageFromFnmatch(PackageContainerInterface * const pci,
pkgCacheFile &Cache, std::string pattern)
{
static const char * const isfnmatch = ".?*[]!";
- if (_config->FindB("APT::Cmd::Pattern-Only", false))
- return false;
+ // Whitelist approach: Anything not in here is not a valid pattern
+ static const char *const isfnmatch_strict = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.:*";
+
+ if (_config->FindB("APT::Cmd::Pattern-Only", false) && pattern.find_first_not_of(isfnmatch_strict) != std::string::npos)
+ return false;
if (pattern.find_first_of(isfnmatch) == std::string::npos)
return false;
diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc
index f5c31bbcd..eee657c46 100644
--- a/apt-private/private-list.cc
+++ b/apt-private/private-list.cc
@@ -39,6 +39,7 @@ struct PackageSortAlphabetic /*{{{*/
class PackageNameMatcher : public Matcher
{
+ static constexpr const char *const isfnmatch_strict = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.:*";
pkgCacheFile &cacheFile;
public:
explicit PackageNameMatcher(pkgCacheFile &cacheFile, const char **patterns)
@@ -48,12 +49,12 @@ class PackageNameMatcher : public Matcher
{
std::string pattern = patterns[i];
APT::CacheFilter::Matcher *cachefilter = NULL;
- if (pattern.size() > 0 && (pattern[0] == '?' || pattern[0] == '~'))
- cachefilter = APT::CacheFilter::ParsePattern(pattern, &cacheFile).release();
- else if(_config->FindB("APT::Cmd::Use-Regexp", false) == true)
+ if(_config->FindB("APT::Cmd::Use-Regexp", false) == true)
cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern);
- else
+ else if (pattern.find_first_not_of(isfnmatch_strict) == std::string::npos)
cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern);
+ else
+ cachefilter = APT::CacheFilter::ParsePattern(pattern, &cacheFile).release();
if (cachefilter == nullptr) {
return;
diff --git a/test/integration/test-apt-patterns b/test/integration/test-apt-patterns
index b55caf35b..33df21d36 100755
--- a/test/integration/test-apt-patterns
+++ b/test/integration/test-apt-patterns
@@ -233,3 +233,37 @@ testsuccessequal "Listing..." apt list '?x-name-fnmatch(1)'
testsuccessequal "Listing...
automatic1/now 1.0 i386 [installed,local]
manual1/now 1.0 i386 [installed,local]" apt list '?x-name-fnmatch(*1)'
+
+
+# * wildcards should still work
+testsuccessequal "Listing...
+automatic1/now 1.0 i386 [installed,local]
+automatic2/now 1.0 i386 [installed,local]" apt list 'automatic*'
+
+testfailureequal "Reading package lists...
+Building dependency tree...
+Reading state information...
+Note, selecting 'automatic1' for glob 'automatic*'
+Note, selecting 'automatic2' for glob 'automatic*'
+automatic1 is already the newest version (1.0).
+automatic1 set to manually installed.
+automatic2 is already the newest version (1.0).
+automatic2 set to manually installed.
+You might want to run 'apt --fix-broken install' to correct these.
+The following packages have unmet dependencies:
+ broken : Depends: does-not-exist but it is not installable
+E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution)." apt install -s 'automatic*'
+
+# other wildcards should fail
+
+testfailureequal "Listing...
+E: input:0-10: error: Expected pattern
+ automatic?
+ ^^^^^^^^^^" apt list 'automatic?'
+
+
+
+testfailureequal "Reading package lists...
+Building dependency tree...
+Reading state information...
+E: Unable to locate package automatic?" apt install -s 'automatic?'