[Aptitude-devel] r2970 - in branches/aptitude-0.3/aptitude: . src/generic/problemresolver

Daniel Burrows dburrows@costa.debian.org
Sat, 09 Apr 2005 19:12:52 +0000


Author: dburrows
Date: Sat Apr  9 19:12:49 2005
New Revision: 2970

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h
Log:
Fix an infinite loop.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Sat Apr  9 19:12:49 2005
@@ -2,6 +2,12 @@
 
 	* src/generic/problemresolver/aptitude_resolver.h:
 
+	  When normalizing solver-iterators, include the code to advance
+	  the dependency inside the loop that runs till we run out of deps
+	  (so the program doesn't go into an infinite loop..oops..).
+
+	* src/generic/problemresolver/aptitude_resolver.h:
+
 	  Add code to drop self-conflicts.
 
 	* src/generic/problemresolver/aptitude_resolver.h:

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h	Sat Apr  9 19:12:49 2005
@@ -434,21 +434,25 @@
 		else
 		  ++prv_lst;
 	      }
-	  }
 
-	if(!(dep_lst->CompareOp & pkgCache::Dep::Or))
-	  finished=true;
-	else
-	  {
-	    ++dep_lst;
-	    // Since we aren't finished, dep_lst should be valid.
-	    assert(!dep_lst.end());
-	    ver_lst=dep_lst.TargetPkg().VersionList();
-
-	    // Only set the prv_lst to non-end if there is no target
-	    // version.
-	    if(!dep_lst.TargetVer())
-	      prv_lst=dep_lst.TargetPkg().ProvidesList();
+	    // No more target versions or providers of the target;
+	    // increment the dependency list if we aren't yet at the
+	    // end of the OR group.
+
+	    if(!(dep_lst->CompareOp & pkgCache::Dep::Or))
+	      finished=true;
+	    else
+	      {
+		++dep_lst;
+		// Since we aren't finished, dep_lst should still be
+		// valid.
+		assert(!dep_lst.end());
+		ver_lst=dep_lst.TargetPkg().VersionList();
+
+		// Only set the prv_lst to non-end if there is no target
+		// version.
+		prv_lst=dep_lst.TargetPkg().ProvidesList();
+	      }
 	  }
       }
     else