summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2017-12-24 10:31:29 +0100
committerDavid Kalnischkies <david@kalnischkies.de>2017-12-24 10:31:29 +0100
commit5ba048a475cfd728906875327ddceed4614a1c9d (patch)
tree90f67ff937c18d4ea5076e90d51a7163704d36f6
parenta6c7b262212d56a4ad37e6475f96152296ab1d0c (diff)
do not remap current files if nullptrs in cache generation
If the cache needs to grow to make room to insert volatile files like deb files into the cache we were remapping null-pointers making them non-null-pointers in the process causing trouble later on. Only the current Releasefile pointer can currently legally be a nullpointer as volatile files have no release file they belong to, but for safety the pointer to the current Packages file is equally guarded. The option APT::Cache-Start can be used to workaround this problem. Reported-By: Mattia Rizzolo on IRC
-rw-r--r--apt-pkg/pkgcachegen.cc21
-rwxr-xr-xtest/integration/test-apt-cache-remapping47
2 files changed, 58 insertions, 10 deletions
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 1748e8bc1..8fa231862 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -55,7 +55,7 @@ using APT::StringView;
/* We set the dirty flag and make sure that is written to the disk */
pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) :
Map(*pMap), Cache(pMap,false), Progress(Prog),
- CurrentRlsFile(NULL), CurrentFile(NULL), d(NULL)
+ CurrentRlsFile(nullptr), CurrentFile(nullptr), d(nullptr)
{
}
bool pkgCacheGenerator::Start()
@@ -159,8 +159,10 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM
Cache.ReMap(false);
- CurrentFile += static_cast<pkgCache::PackageFile const *>(newMap) - static_cast<pkgCache::PackageFile const *>(oldMap);
- CurrentRlsFile += static_cast<pkgCache::ReleaseFile const *>(newMap) - static_cast<pkgCache::ReleaseFile const *>(oldMap);
+ if (CurrentFile != nullptr)
+ CurrentFile += static_cast<pkgCache::PackageFile const *>(newMap) - static_cast<pkgCache::PackageFile const *>(oldMap);
+ if (CurrentRlsFile != nullptr)
+ CurrentRlsFile += static_cast<pkgCache::ReleaseFile const *>(newMap) - static_cast<pkgCache::ReleaseFile const *>(oldMap);
for (std::vector<pkgCache::GrpIterator*>::const_iterator i = Dynamic<pkgCache::GrpIterator>::toReMap.begin();
i != Dynamic<pkgCache::GrpIterator>::toReMap.end(); ++i)
@@ -396,7 +398,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
if (List.SameVersion(Hash, Ver) == true)
break;
// sort (volatile) sources above not-sources like the status file
- if ((CurrentFile->Flags & pkgCache::Flag::NotSource) == 0)
+ if (CurrentFile == nullptr || (CurrentFile->Flags & pkgCache::Flag::NotSource) == 0)
{
auto VF = Ver.FileList();
for (; VF.end() == false; ++VF)
@@ -818,7 +820,7 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V,
bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
ListParser &List)
{
- if (CurrentFile == 0)
+ if (CurrentFile == nullptr)
return true;
// Get a structure
@@ -903,7 +905,7 @@ map_pointer_t pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
ListParser &List)
{
- if (CurrentFile == 0)
+ if (CurrentFile == nullptr)
return true;
// Get a structure
@@ -1246,11 +1248,9 @@ bool pkgCacheListParser::SameVersion(unsigned short const Hash, /*{{{*/
bool pkgCacheGenerator::SelectReleaseFile(const string &File,const string &Site,
unsigned long Flags)
{
+ CurrentRlsFile = nullptr;
if (File.empty() && Site.empty())
- {
- CurrentRlsFile = NULL;
return true;
- }
// Get some space for the structure
map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentRlsFile));
@@ -1285,6 +1285,7 @@ bool pkgCacheGenerator::SelectFile(std::string const &File,
std::string const &Component,
unsigned long const Flags)
{
+ CurrentFile = nullptr;
// Get some space for the structure
map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentFile));
if (unlikely(idxFile == 0))
@@ -1316,7 +1317,7 @@ bool pkgCacheGenerator::SelectFile(std::string const &File,
return false;
CurrentFile->Component = component;
CurrentFile->Flags = Flags;
- if (CurrentRlsFile != NULL)
+ if (CurrentRlsFile != nullptr)
CurrentFile->Release = CurrentRlsFile - Cache.RlsFileP;
else
CurrentFile->Release = 0;
diff --git a/test/integration/test-apt-cache-remapping b/test/integration/test-apt-cache-remapping
new file mode 100755
index 000000000..31a406c57
--- /dev/null
+++ b/test/integration/test-apt-cache-remapping
@@ -0,0 +1,47 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+
+setupenvironment
+configarchitecture 'amd64'
+
+buildsimplenativepackage 'foo' 'amd64' '1'
+
+# the default is 1MB – too much for our simple tests
+echo 'APT::Cache-Grow "1000";' > rootdir/etc/apt/apt.conf.d/limit-cachegrow.conf
+
+# experiment with cache remapping
+rm -f rootdir/var/cache/apt/*.bin
+testsuccess apt install ./incoming/foo_1_amd64.deb -s
+msgtest 'Cache files are generated in tests'
+if [ ! -e rootdir/var/cache/apt/srcpkgcache.bin -o ! -e rootdir/var/cache/apt/pkgcache.bin ]; then
+ msgfail 'files do not exist'
+ ls -l rootdir/var/cache/apt/*.bin
+ exit 1
+else
+ msgpass
+fi
+
+SLSIZE="$(stat -c '%s' rootdir/var/cache/apt/srcpkgcache.bin)"
+STSIZE="$(stat -c '%s' rootdir/var/cache/apt/pkgcache.bin)"
+rm -f rootdir/var/cache/apt/*.bin
+testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE" -o APT::Cache-Grow=0
+testfailure test -e rootdir/var/cache/apt/pkgcache.bin
+rm -f rootdir/var/cache/apt/*.bin
+testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE" -o APT::Cache-Limit="$SLSIZE"
+testfailure test -e rootdir/var/cache/apt/pkgcache.bin
+rm -f rootdir/var/cache/apt/*.bin
+testsuccess apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$SLSIZE"
+testsuccess test -e rootdir/var/cache/apt/srcpkgcache.bin -a -e rootdir/var/cache/apt/pkgcache.bin
+
+rm -f rootdir/var/cache/apt/*.bin
+testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Grow=0
+rm -f rootdir/var/cache/apt/*.bin
+testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Limit="$SLSIZE"
+rm -f rootdir/var/cache/apt/*.bin
+testfailure apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE" -o APT::Cache-Limit="$STSIZE"
+rm -f rootdir/var/cache/apt/*.bin
+testsuccess apt install ./incoming/foo_1_amd64.deb -s -o APT::Cache-Start="$STSIZE"
+testsuccess test -e rootdir/var/cache/apt/srcpkgcache.bin -a -e rootdir/var/cache/apt/pkgcache.bin