From cd9694bf7c962b1938690a96017afba54028488a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 14 Jun 2012 15:46:49 +0200 Subject: * deb/deblistparser.cc: - ensure that mixed positive/negative architecture wildcards are handled in the same way as dpkg handles them --- apt-pkg/deb/deblistparser.cc | 53 +++++++++++++++++++++++++------------------- debian/changelog | 9 ++++++++ 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 4948c9be4..d29b28d48 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -561,28 +561,27 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop, // Parse an architecture if (I != Stop && *I == '[') { + ++I; // malformed - I++; - if (I == Stop) - return 0; - - const char *End = I; - bool Found = false; - bool NegArch = false; - while (I != Stop) + if (unlikely(I == Stop)) + return 0; + + const char *End = I; + bool Found = false; + bool NegArch = false; + while (I != Stop) { - // look for whitespace or ending ']' - while (End != Stop && !isspace(*End) && *End != ']') - End++; - - if (End == Stop) + // look for whitespace or ending ']' + for (;End != Stop && !isspace(*End) && *End != ']'; ++End); + + if (unlikely(End == Stop)) return 0; if (*I == '!') - { + { NegArch = true; - I++; - } + ++I; + } if (stringcmp(arch,I,End) == 0) { Found = true; @@ -591,23 +590,31 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop, if (fnmatch(wildcard.c_str(), completeArch.c_str(), 0) == 0) Found = true; } - + + if (Found == true) + { + if (I[-1] != '!') + NegArch = false; + // we found a match, so fast-forward to the end of the wildcards + for (; End != Stop && *End != ']'; ++End); + } + if (*End++ == ']') { I = End; break; } - + I = End; for (;I != Stop && isspace(*I) != 0; I++); - } + } - if (NegArch) + if (NegArch == true) Found = !Found; - - if (Found == false) + + if (Found == false) Package = ""; /* not for this arch */ } - + // Skip whitespace for (;I != Stop && isspace(*I) != 0; I++); } diff --git a/debian/changelog b/debian/changelog index 7fdde4e89..2fb1b50d4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +apt (0.9.6.1) UNRELEASED; urgency=low + + [ David Kalnischkies ] + * deb/deblistparser.cc: + - ensure that mixed positive/negative architecture wildcards + are handled in the same way as dpkg handles them + + -- David Kalnischkies Thu, 14 Jun 2012 15:45:13 +0200 + apt (0.9.6) unstable; urgency=low [ David Kalnischkies ] -- cgit v1.2.3