From bce4caa3078503bc1bec5221c5251d9e418a0f2a Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 13 Mar 2012 14:32:40 +0100 Subject: add APT::pkgPackageManager::MaxLoopCount to ensure that the ordering code does not get into a endless loop when it flip-flops between two states --- apt-pkg/packagemanager.cc | 14 ++++++++++++-- debian/changelog | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index 698c8606f..dd8f306f2 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -337,7 +337,10 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) however if there is a loop (A depends on B, B depends on A) this will not be the case, so check for dependencies before configuring. */ bool Bad = false, Changed = false; - do { + const unsigned int max_loops = _config->FindI("APT::pkgPackageManager::MaxLoopCount", 100); + unsigned int i=0; + do + { Changed = false; for (DepIterator D = instVer.DependsList(); D.end() == false; ) { @@ -460,6 +463,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth) if (Bad == true && Changed == false && Debug == true) std::clog << OutputInDepth(Depth) << "Could not satisfy " << Start << std::endl; } + if (i++ > max_loops) + return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack for %s, aborting", Pkg.FullName().c_str()); } while (Changed == true); if (Bad) { @@ -596,7 +601,10 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured), or by the ConfigureAll call at the end of the for loop in OrderInstall. */ bool Changed = false; - do { + const unsigned int max_loops = _config->FindI("APT::pkgPackageManager::MaxLoopCount", 100); + unsigned int i; + do + { Changed = false; for (DepIterator D = instVer.DependsList(); D.end() == false; ) { @@ -821,6 +829,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c } } } + if (i++ > max_loops) + return _error->Error("Internal error: MaxLoopCount reached in SmartConfigure for %s, aborting", Pkg.FullName().c_str()); } while (Changed == true); // Check for reverse conflicts. diff --git a/debian/changelog b/debian/changelog index 32b271668..2003da5c3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,9 @@ apt (0.8.16~exp14) UNRELEASED; urgency=low [ Michael Vogt ] * apt-pkg/packagemanager.cc: - fix inconsistent clog/cout usage in the debug output + - add APT::pkgPackageManager::MaxLoopCount to ensure that the + ordering code does not get into a endless loop when it flip-flops + between two states [ David Kalnischkies ] * apt-pkg/packagemanager.cc: -- cgit v1.2.3