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;
+ }
}
}