From: Erik Pilkington Date: Mon, 23 Jul 2018 22:23:04 +0000 (+0000) Subject: [demangler] call terminate() if allocation failed X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=faddb71dd9f3a14611898d01f93c0d93e777ac87;p=llvm [demangler] call terminate() if allocation failed We really should set *status to memory_alloc_failure, but we need to refactor the demangler a bit to properly propagate the failure up the stack. Until then, its better to explicitly terminate then rely on a null dereference crash. rdar://31240372 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337759 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Demangle/ItaniumDemangle.cpp b/lib/Demangle/ItaniumDemangle.cpp index 10ec84815e9..30ad30d8271 100644 --- a/lib/Demangle/ItaniumDemangle.cpp +++ b/lib/Demangle/ItaniumDemangle.cpp @@ -1761,13 +1761,17 @@ class BumpPointerAllocator { BlockMeta* BlockList = nullptr; void grow() { - char* NewMeta = new char[AllocSize]; + char* NewMeta = static_cast(std::malloc(AllocSize)); + if (NewMeta == nullptr) + std::terminate(); BlockList = new (NewMeta) BlockMeta{BlockList, 0}; } void* allocateMassive(size_t NBytes) { NBytes += sizeof(BlockMeta); - BlockMeta* NewMeta = reinterpret_cast(new char[NBytes]); + BlockMeta* NewMeta = reinterpret_cast(std::malloc(NBytes)); + if (NewMeta == nullptr) + std::terminate(); BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; return static_cast(NewMeta + 1); } @@ -1793,7 +1797,7 @@ public: BlockMeta* Tmp = BlockList; BlockList = BlockList->Next; if (reinterpret_cast(Tmp) != InitialBuffer) - delete[] reinterpret_cast(Tmp); + std::free(Tmp); } BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; } @@ -1823,10 +1827,15 @@ class PODSmallVector { size_t S = size(); if (isInline()) { auto* Tmp = static_cast(std::malloc(NewCap * sizeof(T))); + if (Tmp == nullptr) + std::terminate(); std::copy(First, Last, Tmp); First = Tmp; - } else + } else { First = static_cast(std::realloc(First, NewCap * sizeof(T))); + if (First == nullptr) + std::terminate(); + } Last = First + S; Cap = First + NewCap; } diff --git a/lib/Demangle/Utility.h b/lib/Demangle/Utility.h index 793021d1d89..54cd99e5026 100644 --- a/lib/Demangle/Utility.h +++ b/lib/Demangle/Utility.h @@ -34,6 +34,8 @@ class OutputStream { if (BufferCapacity < N + CurrentPosition) BufferCapacity = N + CurrentPosition; Buffer = static_cast(std::realloc(Buffer, BufferCapacity)); + if (Buffer == nullptr) + std::terminate(); } } @@ -75,6 +77,8 @@ public: if (!StartBuf || !Size) { StartBuf = static_cast(std::malloc(AllocSize)); + if (StartBuf == nullptr) + std::terminate(); Size = &AllocSize; }