From: Julian Andres Klode <jak@debian.org>
Date: Tue, 5 Jul 2016 06:21:28 +0000 (+0200)
Subject: indextargets: Check that cache could be built before using it
X-Git-Tag: 1.3_pre1~14
X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/8823972649b0d3049c9c0d34b5f1d31160234fb4

indextargets: Check that cache could be built before using it

This caused a crash because the cache was a nullptr.

Closes: #829651
---

diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 73db71f00..95d88e2ad 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