From f40fdaa43271edf98b80c08e20f401b5da591501 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Sat, 19 Mar 2016 01:56:38 +0100 Subject: cachefile: Only set members that were initialized successfully Otherwise, things will just start failing later down the stack, because (a) the lazy getters do not check if building was successful and (b) any further getter call would return the invalid object anyway. Also initialize VS in pkgCache to nullptr by default. Closes: #818628 --- apt-pkg/cachefile.cc | 62 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 16 deletions(-) (limited to 'apt-pkg/cachefile.cc') diff --git a/apt-pkg/cachefile.cc b/apt-pkg/cachefile.cc index 909da5cb4..0e2192973 100644 --- a/apt-pkg/cachefile.cc +++ b/apt-pkg/cachefile.cc @@ -32,6 +32,7 @@ #include #include #include +#include #include /*}}}*/ @@ -69,9 +70,13 @@ public: ScopedErrorMerge() { _error->PushToStack(); } ~ScopedErrorMerge() { _error->MergeWithStack(); } }; + bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock) { - if (Cache != NULL) + std::unique_ptr Cache; + std::unique_ptr Map; + + if (this->Cache != NULL) return true; ScopedErrorMerge sem; @@ -80,11 +85,16 @@ bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock) FileFd file(_config->FindFile("Dir::Cache::pkgcache"), FileFd::ReadOnly); if (file.IsOpen() == false || file.Failed()) return false; - Map = new MMap(file, MMap::Public|MMap::ReadOnly); + Map.reset(new MMap(file, MMap::Public|MMap::ReadOnly)); if (unlikely(Map->validData() == false)) return false; - Cache = new pkgCache(Map); - return _error->PendingError() == false; + Cache.reset(new pkgCache(Map.get())); + if (_error->PendingError() == true) + return false; + + this->Cache = Cache.release(); + this->Map = Map.release(); + return true; } if (WithLock == true) @@ -94,11 +104,15 @@ bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock) if (_error->PendingError() == true) return false; - BuildSourceList(Progress); + if (BuildSourceList(Progress) == false) + return false; // Read the caches - Cache = nullptr; - bool Res = pkgCacheGenerator::MakeStatusCache(*SrcList,Progress,&Map, &Cache, true); + MMap *TmpMap = nullptr; + pkgCache *TmpCache = nullptr; + bool Res = pkgCacheGenerator::MakeStatusCache(*SrcList,Progress,&TmpMap, &TmpCache, true); + Map.reset(TmpMap); + Cache.reset(TmpCache); if (Progress != NULL) Progress->Done(); if (Res == false) @@ -109,9 +123,12 @@ bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock) _error->Warning(_("You may want to run apt-get update to correct these problems")); if (Cache == nullptr) - Cache = new pkgCache(Map); + Cache.reset(new pkgCache(Map.get())); if (_error->PendingError() == true) return false; + this->Map = Map.release(); + this->Cache = Cache.release(); + return true; } /*}}}*/ @@ -120,12 +137,14 @@ bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock) /* */ bool pkgCacheFile::BuildSourceList(OpProgress * /*Progress*/) { - if (SrcList != NULL) + std::unique_ptr SrcList; + if (this->SrcList != NULL) return true; - SrcList = new pkgSourceList(); + SrcList.reset(new pkgSourceList()); if (SrcList->ReadMainList() == false) return _error->Error(_("The list of sources could not be read.")); + this->SrcList = SrcList.release(); return true; } /*}}}*/ @@ -134,16 +153,18 @@ bool pkgCacheFile::BuildSourceList(OpProgress * /*Progress*/) /* */ bool pkgCacheFile::BuildPolicy(OpProgress * /*Progress*/) { - if (Policy != NULL) + std::unique_ptr Policy; + if (this->Policy != NULL) return true; - Policy = new pkgPolicy(Cache); + Policy.reset(new pkgPolicy(Cache)); if (_error->PendingError() == true) return false; if (ReadPinFile(*Policy) == false || ReadPinDir(*Policy) == false) return false; + this->Policy = Policy.release(); return true; } /*}}}*/ @@ -152,17 +173,21 @@ bool pkgCacheFile::BuildPolicy(OpProgress * /*Progress*/) /* */ bool pkgCacheFile::BuildDepCache(OpProgress *Progress) { - if (DCache != NULL) + std::unique_ptr DCache; + if (this->DCache != NULL) return true; if (BuildPolicy(Progress) == false) return false; - DCache = new pkgDepCache(Cache,Policy); + DCache.reset(new pkgDepCache(Cache,Policy)); if (_error->PendingError() == true) return false; + if (DCache->Init(Progress) == false) + return false; - return DCache->Init(Progress); + this->DCache = DCache.release(); + return true; } /*}}}*/ // CacheFile::Open - Open the cache files, creating if necessary /*{{{*/ @@ -225,7 +250,12 @@ bool pkgCacheFile::AddIndexFile(pkgIndexFile * const File) /*{{{*/ return false; } Cache = new pkgCache(Map); - return _error->PendingError() == false; + if (_error->PendingError() == true) { + delete Cache; + Cache = nullptr; + return false; + } + return true; } else { -- cgit v1.2.3