Przeglądaj źródła

handle pkgnames shorter than modifiers

The bugreport highlights the problem with an empty package name. We fix
this by 'ignoring' these so that it behaves just like "apt-get install".
The deeper problem is that modifier strings can be longer than a package
name in which case the comparison doesn't make sense, so don't compare
then. Was not noticed so far as all modifiers are of length 1, so the
only package name shorter than this is in fact the empty package name.

Closes: 744940
David Kalnischkies 12 lat temu
rodzic
commit
d99854cac4

+ 4 - 2
apt-pkg/cacheset.cc

@@ -391,6 +391,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
 							CacheSetHelper &helper) {
 	Version select = NEWEST;
 	std::string str = cmdline;
+	if (unlikely(str.empty() == true))
+		return false;
 	bool modifierPresent = false;
 	unsigned short fallback = modID;
 	for (std::list<Modifier>::const_iterator mod = mods.begin();
@@ -400,8 +402,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
 		size_t const alength = strlen(mod->Alias);
 		switch(mod->Pos) {
 		case Modifier::POSTFIX:
-			if (str.compare(str.length() - alength, alength,
-					mod->Alias, 0, alength) != 0)
+			if (str.length() <= alength ||
+			      str.compare(str.length() - alength, alength, mod->Alias, 0, alength) != 0)
 				continue;
 			str.erase(str.length() - alength);
 			modID = mod->ID;

+ 5 - 1
test/integration/test-ubuntu-bug-365611-long-package-names

@@ -4,8 +4,12 @@ set -e
 TESTDIR=$(readlink -f $(dirname $0))
 . $TESTDIR/framework
 setupenvironment
-configarchitecture "i386"
+configarchitecture 'i386'
 setupaptarchive
 
 aptget install $(for i in $(seq 0 1000); do echo -n 'a'; done) 2> longpackagename.log > /dev/null || true
 testfileequal 'longpackagename.log' "E: Unable to locate package $(for i in $(seq 0 1000); do echo -n 'a'; done)"
+
+# … and the opposite of long:
+aptget install "" -s >longpackagename.log 2>&1 || true
+testfileequal 'longpackagename.log' "$(aptget install -s)"