X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/3ac981df108470b42b89d0d4a816a5e3ba58c501..fcffe89d8344e699267210badac53ff24dd41148:/apt-pkg/contrib/mmap.cc diff --git a/apt-pkg/contrib/mmap.cc b/apt-pkg/contrib/mmap.cc index df7cd2a59..8e169027e 100644 --- a/apt-pkg/contrib/mmap.cc +++ b/apt-pkg/contrib/mmap.cc @@ -22,11 +22,11 @@ #include #include #include +#include +#include #include -#include #include -#include #include #include #include @@ -186,7 +186,6 @@ bool MMap::Sync(unsigned long Start,unsigned long Stop) if ((Flags & UnMapped) == UnMapped) return true; - unsigned long long PSize = sysconf(_SC_PAGESIZE); if ((Flags & ReadOnly) != ReadOnly) { if (SyncToFd != 0) @@ -198,7 +197,8 @@ bool MMap::Sync(unsigned long Start,unsigned long Stop) else { #ifdef _POSIX_SYNCHRONIZED_IO - if (msync((char *)Base+(unsigned long long)(Start/PSize)*PSize,Stop - Start,MS_SYNC) < 0) + unsigned long long const PSize = sysconf(_SC_PAGESIZE); + if (msync((char *)Base+(Start/PSize)*PSize, Stop - Start, MS_SYNC) < 0) return _error->Errno("msync", _("Unable to synchronize mmap")); #endif } @@ -215,9 +215,6 @@ DynamicMMap::DynamicMMap(FileFd &F,unsigned long Flags,unsigned long const &Work MMap(F,Flags | NoImmMap), Fd(&F), WorkSpace(Workspace), GrowFactor(Grow), Limit(Limit) { - if (_error->PendingError() == true) - return; - // disable Moveable if we don't grow if (Grow == 0) this->Flags &= ~Moveable; @@ -252,9 +249,6 @@ DynamicMMap::DynamicMMap(unsigned long Flags,unsigned long const &WorkSpace, MMap(Flags | NoImmMap | UnMapped), Fd(0), WorkSpace(WorkSpace), GrowFactor(Grow), Limit(Limit) { - if (_error->PendingError() == true) - return; - // disable Moveable if we don't grow if (Grow == 0) this->Flags &= ~Moveable; @@ -352,6 +346,12 @@ unsigned long DynamicMMap::RawAllocate(unsigned long long Size,unsigned long Aln size in the file. */ unsigned long DynamicMMap::Allocate(unsigned long ItemSize) { + if (unlikely(ItemSize == 0)) + { + _error->Fatal("Can't allocate an item of size zero"); + return 0; + } + // Look for a matching pool entry Pool *I; Pool *Empty = 0; @@ -384,12 +384,15 @@ unsigned long DynamicMMap::Allocate(unsigned long ItemSize) const unsigned long size = 20*1024; I->Count = size/ItemSize; Pool* oldPools = Pools; + _error->PushToStack(); Result = RawAllocate(size,ItemSize); + bool const newError = _error->PendingError(); + _error->MergeWithStack(); if (Pools != oldPools) I += Pools - oldPools; // Does the allocation failed ? - if (Result == 0 && _error->PendingError()) + if (Result == 0 && newError) return 0; I->Start = Result; } @@ -410,9 +413,12 @@ unsigned long DynamicMMap::WriteString(const char *String, if (Len == (unsigned long)-1) Len = strlen(String); + _error->PushToStack(); unsigned long const Result = RawAllocate(Len+1,0); + bool const newError = _error->PendingError(); + _error->MergeWithStack(); - if (Result == 0 && _error->PendingError()) + if (Base == NULL || (Result == 0 && newError)) return 0; memcpy((char *)Base + Result,String,Len);