]> git.saurik.com Git - apt.git/commitdiff
do not ++ on erased package pointers in autoremove
authorDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 3 Oct 2013 20:23:11 +0000 (22:23 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 3 Oct 2013 20:23:11 +0000 (22:23 +0200)
Symptom: In an Ubuntu precise chroot (like on travis-ci)
test-bug-613420-new-garbage-dependency segfaults in a std::set
operator++ on an iterator we have erased previously
(but not if run under gdb of course)

apt-private/private-install.cc

index 9adad45af7071228fc8254c5ed807c5b401db6f8..643a6b370475dc9b2eeded856b9a8b568db175c7 100644 (file)
@@ -438,15 +438,15 @@ bool DoAutomaticRemove(CacheFile &Cache)
       do {
         Changed = false;
         for (APT::PackageSet::const_iterator Pkg = tooMuch.begin();
-             Pkg != tooMuch.end() && Changed == false; ++Pkg)
+             Pkg != tooMuch.end(); ++Pkg)
         {
            APT::PackageSet too;
            too.insert(*Pkg);
            for (pkgCache::PrvIterator Prv = Cache[Pkg].CandidateVerIter(Cache).ProvidesList();
                 Prv.end() == false; ++Prv)
               too.insert(Prv.ParentPkg());
-           for (APT::PackageSet::const_iterator P = too.begin();
-                P != too.end() && Changed == false; ++P) {
+           for (APT::PackageSet::const_iterator P = too.begin(); P != too.end(); ++P)
+           {
               for (pkgCache::DepIterator R = P.RevDependsList();
                    R.end() == false; ++R)
               {
@@ -465,7 +465,11 @@ bool DoAutomaticRemove(CacheFile &Cache)
                 Changed = true;
                 break;
               }
+              if (Changed == true)
+                 break;
            }
+           if (Changed == true)
+              break;
         }
       } while (Changed == true);
    }