From d30f800560010cb123fdd74b46c727df0e54eaed Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 5 Jul 2016 08:21:28 +0200 Subject: indextargets: Check that cache could be built before using it This caused a crash because the cache was a nullptr. Closes: #829651 (cherry picked from commit 8823972649b0d3049c9c0d34b5f1d31160234fb4) --- cmdline/apt-get.cc | 6 +++--- test/integration/test-bug-829651 | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/integration/test-bug-829651 diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 4ac15274c..58c06092d 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -248,8 +248,9 @@ static bool DoIndexTargets(CommandLine &CmdL) { pkgCacheFile CacheFile; pkgSourceList *SrcList = CacheFile.GetSourceList(); + pkgCache *Cache = CacheFile.GetPkgCache(); - if (SrcList == NULL) + if (SrcList == nullptr || Cache == nullptr) return false; std::string const Format = _config->Find("APT::Get::IndexTargets::Format"); @@ -262,8 +263,7 @@ static bool DoIndexTargets(CommandLine &CmdL) if (ReleaseInfo) { AddOptions.insert(std::make_pair("TRUSTED", ((*S)->IsTrusted() ? "yes" : "no"))); - pkgCache &Cache = *CacheFile.GetPkgCache(); - pkgCache::RlsFileIterator const RlsFile = (*S)->FindInCache(Cache, false); + pkgCache::RlsFileIterator const RlsFile = (*S)->FindInCache(*Cache, false); if (RlsFile.end()) continue; #define APT_RELEASE(X,Y) if (RlsFile.Y() != NULL) AddOptions.insert(std::make_pair(X, RlsFile.Y())) diff --git a/test/integration/test-bug-829651 b/test/integration/test-bug-829651 new file mode 100644 index 000000000..976bb040c --- /dev/null +++ b/test/integration/test-bug-829651 @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" +setupenvironment +configarchitecture 'amd64' + +if [ "$(id -u)" = '0' ]; then + msgskip 'Tests for unreadable files do not work as root' + exit 0 +fi + +insertinstalledpackage 'foo' 'amd64' '1' +insertpackage 'unstable' 'foo' 'amd64' '2' + +setupaptarchive + + +testsuccess aptget indextargets + +aptget clean +chmod -r rootdir/var/lib/dpkg/status + +testfailureequal "E: Could not open file ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status - open (13: Permission denied) +E: Problem opening ${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status +E: The package lists or status file could not be parsed or opened." aptget indextargets -- cgit v1.2.3