]> git.saurik.com Git - apt.git/commitdiff
do not modify DepIterator as we might check again
authorDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 24 Jun 2013 10:29:48 +0000 (12:29 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Mon, 24 Jun 2013 10:29:48 +0000 (12:29 +0200)
fixup for 42d51f333e8ef522fed02cdfc48663488d56c3a3

The for-loop iterating over the DepIterators which need configuration
can (and will be in 'complicated' situations) run multiple times, so we
can't just GlobOr on the DepIterator as it modifies it, so that the next
iteration over the list ends up checking another dependency leading us
into a 'Internal error, packages left unconfigured. foopkg' maybe or we
are 'lucky' and calculate a solution which might break down the line

Git-Dch: Ignore

apt-pkg/packagemanager.cc

index b8932753d0aff0e82b3b9646baea5d7c8ba9a2cf..310934c42d4dea65bcd4b660f4cb994876b03292 100644 (file)
@@ -420,11 +420,14 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
    do
    {
       Changed = false;
-      for (std::list<DepIterator>::iterator D = needConfigure.begin(); D != needConfigure.end(); ++D)
+      for (std::list<DepIterator>::const_iterator D = needConfigure.begin(); D != needConfigure.end(); ++D)
       {
-        // Compute a single dependency element (glob or)
+        // Compute a single dependency element (glob or) without modifying D
         pkgCache::DepIterator Start, End;
-        D->GlobOr(Start,End);
+        {
+           pkgCache::DepIterator Discard = *D;
+           Discard.GlobOr(Start,End);
+        }
 
         if (End->Type != pkgCache::Dep::Depends)
            continue;
@@ -483,9 +486,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;
+           std::clog << OutputInDepth(Depth) << "Could not satisfy " << *D << std::endl;
       }
       if (i++ > max_loops)
          return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (2) for %s, aborting", Pkg.FullName().c_str());