* deb/deblistparser.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 14 Jun 2012 13:46:49 +0000 (15:46 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 14 Jun 2012 13:46:49 +0000 (15:46 +0200)
  - ensure that mixed positive/negative architecture wildcards
    are handled in the same way as dpkg handles them

apt-pkg/deb/deblistparser.cc
debian/changelog

index 4948c9b..d29b28d 100644 (file)
@@ -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++);
    }
index 7fdde4e..2fb1b50 100644 (file)
@@ -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 <kalnischkies@gmail.com>  Thu, 14 Jun 2012 15:45:13 +0200
+
 apt (0.9.6) unstable; urgency=low
 
   [ David Kalnischkies ]