[Aptitude-svn-commit] r3950 - in branches/aptitude-0.3/aptitude: . src/generic

Daniel Burrows dburrows at costa.debian.org
Thu Aug 25 02:21:51 UTC 2005


Author: dburrows
Date: Thu Aug 25 02:21:48 2005
New Revision: 3950

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc
Log:
Don't crash when an UNINST version is passed to solved_by().

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Thu Aug 25 02:21:48 2005
@@ -1,5 +1,9 @@
 2005-08-24  Daniel Burrows  <dburrows at debian.org>
 
+	* src/generic/aptitude_resolver_universe.cc:
+
+	  Don't crash when an UNINST version is passed to solved_by().
+
 	* tests/test_apt_universe.cc:
 
 	  Handle dependency sources correctly when testing the solver

Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc	Thu Aug 25 02:21:48 2005
@@ -261,38 +261,51 @@
   pkgCache::DepIterator d = start;
 
   if(start->Type != pkgCache::Dep::Conflicts)
-    while(1)
-      {
-	if(d.TargetPkg() == v.get_pkg() &&
-	   (!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
-						    d->CompareOp,
-						    d.TargetVer())))
-	  return true;
-
-	if((d->CompareOp & pkgCache::Dep::Or) != 0)
-	  ++d;
-	else
-	  return false;
-      }
+    {
+      // Of course, installing an end version never fixes a
+      // non-conflict unless it removes the source (tested for above).
+      if(v.get_ver().end())
+	return false;
+
+      while(1)
+	{
+	  if(d.TargetPkg() == v.get_pkg() &&
+	     (!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
+						      d->CompareOp,
+						      d.TargetVer())))
+	    return true;
+
+	  if((d->CompareOp & pkgCache::Dep::Or) != 0)
+	    ++d;
+	  else
+	    return false;
+	}
+    }
   else if(prv.end())
     {
+      if(d.TargetPkg() != v.get_pkg())
+	return false;
+
+      if(v.get_ver().end())
+	return true;
+
       // Check the non-virtual part of the conflict: the package is
       // the same and the version **doesn't** match.
-      return (d.TargetPkg() == v.get_pkg() &&
-	      !(!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
-							d->CompareOp,
-							d.TargetVer())));
+      return !(!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
+						       d->CompareOp,
+						       d.TargetVer()));
     }
   else
     {
-      if(d.TargetVer())
-	return false;
+      // Since dependencies are never versioned, I never create
+      // dependency objects for versioned dependencies that go through
+      // Provides.
+      assert(!d.TargetVer());
 
-      // Check the virtual part of the conflict.
-      for(pkgCache::PrvIterator p = v.get_ver().ProvidesList();
-	  !p.end(); ++p)
-	if(p.ParentPkg() == d.TargetPkg())
-	  return true;
+      if(v.get_pkg() != const_cast<pkgCache::PrvIterator &>(prv).OwnerPkg())
+	return false;
+      else
+	return v.get_ver() == const_cast<pkgCache::PrvIterator &>(prv).OwnerVer();
 
       return false;
     }



More information about the Aptitude-svn-commit mailing list