SVN commit 1205641 by jmthomas: Check to see if the VerIterator we get from the state cache is valid or not. If it's a purely virtual package it will not be in the depCache, and will crash us when we try to access it M +33 -3 package.cpp --- trunk/extragear/sysadmin/libqapt/src/package.cpp #1205640:1205641 @@ -763,8 +763,18 @@ pkgDepCache::StateCache & State = (*d->depCache)[*d->packageIter]; Ver = State.CandidateVerIter(*d->depCache); + if (Ver.end()) { + return recommends; + } + for(pkgCache::DepIterator it = Ver.DependsList(); !it.end(); ++it) { - pkgDepCache::StateCache &rState = (*d->depCache)[it.TargetPkg()]; + pkgCache::PkgIterator pkg = it.TargetPkg(); + + // Skip purely virtual packages + if (!pkg->VersionList) { + continue; + } + pkgDepCache::StateCache &rState = (*d->depCache)[pkg]; if (it->Type == pkgCache::Dep::Recommends && (rState.CandidateVer != 0 )) { recommends << QString::fromStdString(it.TargetPkg().Name()); } @@ -781,8 +791,18 @@ pkgDepCache::StateCache & State = (*d->depCache)[*d->packageIter]; Ver = State.CandidateVerIter(*d->depCache); + if (Ver.end()) { + return suggests; + } + for(pkgCache::DepIterator it = Ver.DependsList(); !it.end(); ++it) { - pkgDepCache::StateCache &sState = (*d->depCache)[it.TargetPkg()]; + pkgCache::PkgIterator pkg = it.TargetPkg(); + + // Skip purely virtual packages + if (!pkg->VersionList) { + continue; + } + pkgDepCache::StateCache &sState = (*d->depCache)[pkg]; if (it->Type == pkgCache::Dep::Suggests && (sState.CandidateVer != 0 )) { suggests << QString::fromStdString(it.TargetPkg().Name()); } @@ -799,8 +819,18 @@ pkgDepCache::StateCache & State = (*d->depCache)[*d->packageIter]; Ver = State.CandidateVerIter(*d->depCache); + if (Ver.end()) { + return enhances; + } + for(pkgCache::DepIterator it = Ver.DependsList(); !it.end(); ++it) { - pkgDepCache::StateCache &eState = (*d->depCache)[it.TargetPkg()]; + pkgCache::PkgIterator pkg = it.TargetPkg(); + + // Skip purely virtual packages + if (!pkg->VersionList) { + continue; + } + pkgDepCache::StateCache &eState = (*d->depCache)[pkg]; if (it->Type == pkgCache::Dep::Enhances && (eState.CandidateVer != 0 )) { enhances << QString::fromStdString(it.TargetPkg().Name()); }