OK, I think I have a fix (attached).

  Daniel
changeset:   3428:6e2e2cd8003d
tag:         tip
user:        Daniel Burrows <[email protected]>
date:        Wed Nov 18 07:14:31 2009 -0800
summary:     Fix several places where the "why" code dereferenced version iterators without checking if they were valid. (Closes: #546446)

diff -r 45ab30c06993 -r 6e2e2cd8003d src/cmdline/cmdline_why.cc
--- a/src/cmdline/cmdline_why.cc	Wed Nov 18 06:33:54 2009 -0800
+++ b/src/cmdline/cmdline_why.cc	Wed Nov 18 07:14:31 2009 -0800
@@ -523,15 +523,19 @@
 	    if(is_provides())
 	      {
 		pkgCache::VerIterator provider_current = get_provides().OwnerPkg().CurrentVer();
-		for(pkgCache::PrvIterator prv = provider_current.ProvidesList();
+
+		if(!provider_current.end())
+		  {
+		    for(pkgCache::PrvIterator prv = provider_current.ProvidesList();
 		    !satisfied_by_current && !prv.end(); ++prv)
-		  {
-		    if(dep.TargetVer() == NULL ||
-		       (prv.ProvideVersion() != NULL &&
-			_system->VS->CheckDep(prv.ProvideVersion(),
-					      dep->CompareOp,
-					      dep.TargetVer())))
-		      satisfied_by_current = true;
+		      {
+			if(dep.TargetVer() == NULL ||
+			   (prv.ProvideVersion() != NULL &&
+			    _system->VS->CheckDep(prv.ProvideVersion(),
+						  dep->CompareOp,
+						  dep.TargetVer())))
+			  satisfied_by_current = true;
+		      }
 		  }
 	      }
 	    else
@@ -539,11 +543,14 @@
 		if((*apt_cache_file)[dep.TargetPkg()].Status != 2)
 		  {
 		    pkgCache::VerIterator current = dep.TargetPkg().CurrentVer();
-		    if(dep.TargetVer() == NULL ||
-		       _system->VS->CheckDep(current.VerStr(),
-					     dep->CompareOp,
-					     dep.TargetVer()))
-		      satisfied_by_current = true;
+		    if(!current.end())
+		      {
+			if(dep.TargetVer() == NULL ||
+			   _system->VS->CheckDep(current.VerStr(),
+						 dep->CompareOp,
+						 dep.TargetVer()))
+			  satisfied_by_current = true;
+		      }
 		  }
 	      }
 

Reply via email to