]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/deblistparser.cc
merge from lp:~donkult/apt/sid
[apt.git] / apt-pkg / deb / deblistparser.cc
index efb76ef54795ae0833676b43a733cc13ad869307..b84bd6fddb8fa974c9fdf5ba7323ce87d00ea82f 100644 (file)
@@ -635,7 +635,8 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
         return _error->Error("Problem parsing dependency %s",Tag);
       size_t const found = Package.rfind(':');
 
-      if (MultiArchEnabled == true &&
+      // If negative is unspecific it needs to apply on all architectures
+      if (MultiArchEnabled == true && found == string::npos &&
          (Type == pkgCache::Dep::Conflicts ||
           Type == pkgCache::Dep::DpkgBreaks ||
           Type == pkgCache::Dep::Replaces))
@@ -644,6 +645,8 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
              a != Architectures.end(); ++a)
            if (NewDepends(Ver,Package,*a,Version,Op,Type) == false)
               return false;
+        if (NewDepends(Ver,Package,"none",Version,Op,Type) == false)
+           return false;
       }
       else if (MultiArchEnabled == true && found != string::npos &&
               strcmp(Package.c_str() + found, ":any") != 0)
@@ -657,8 +660,18 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
         if (NewDepends(Ver,Package,Arch,Version,Op,Type) == false)
            return false;
       }
-      else if (NewDepends(Ver,Package,pkgArch,Version,Op,Type) == false)
-        return false;
+      else
+      {
+        if (NewDepends(Ver,Package,pkgArch,Version,Op,Type) == false)
+           return false;
+        if ((Type == pkgCache::Dep::Conflicts ||
+             Type == pkgCache::Dep::DpkgBreaks ||
+             Type == pkgCache::Dep::Replaces) &&
+            NewDepends(Ver, Package,
+                       (pkgArch != "none") ? "none" : _config->Find("APT::Architecture"),
+                       Version,Op,Type) == false)
+           return false;
+      }
       if (Start == Stop)
         break;
    }
@@ -752,13 +765,15 @@ bool debListParser::Step()
          drop the whole section. A missing arch tag only happens (in theory)
          inside the Status file, so that is a positive return */
       string const Architecture = Section.FindS("Architecture");
-      if (Architecture.empty() == true)
-        return true;
 
       if (Arch.empty() == true || Arch == "any" || MultiArchEnabled == false)
       {
         if (APT::Configuration::checkArchitecture(Architecture) == true)
            return true;
+        /* parse version stanzas without an architecture only in the status file
+           (and as misfortune bycatch flat-archives) */
+        if ((Arch.empty() == true || Arch == "any") && Architecture.empty() == true)
+           return true;
       }
       else
       {
@@ -782,7 +797,8 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
 {
    // apt-secure does no longer download individual (per-section) Release
    // file. to provide Component pinning we use the section name now
-   FileI->Component = WriteUniqString(component);
+   map_ptrloc const storage = WriteUniqString(component);
+   FileI->Component = storage;
 
    // FIXME: Code depends on the fact that Release files aren't compressed
    FILE* release = fdopen(dup(File.Fd()), "r");
@@ -869,13 +885,14 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
               break;
            *s = '\0';
         }
+        map_ptrloc const storage = WriteUniqString(data);
         switch (writeTo) {
-        case Suite: FileI->Archive = WriteUniqString(data); break;
-        case Component: FileI->Component = WriteUniqString(data); break;
-        case Version: FileI->Version = WriteUniqString(data); break;
-        case Origin: FileI->Origin = WriteUniqString(data); break;
-        case Codename: FileI->Codename = WriteUniqString(data); break;
-        case Label: FileI->Label = WriteUniqString(data); break;
+        case Suite: FileI->Archive = storage; break;
+        case Component: FileI->Component = storage; break;
+        case Version: FileI->Version = storage; break;
+        case Origin: FileI->Origin = storage; break;
+        case Codename: FileI->Codename = storage; break;
+        case Label: FileI->Label = storage; break;
         case None: break;
         }
       }