summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2013-10-03 22:23:11 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2013-10-03 22:23:11 +0200
commit3a7a206f40b8fda475e39566fc220fe8c5b59a17 (patch)
treec173b52a95a12b5f08efb1d198796bffd9cf56e4
parent342df712331004aa4907c9dbdf4b7728d087efb0 (diff)
do not ++ on erased package pointers in autoremove
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)
-rw-r--r--apt-private/private-install.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc
index 9adad45af..643a6b370 100644
--- a/apt-private/private-install.cc
+++ b/apt-private/private-install.cc
@@ -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);
}