diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-07-23 22:23:04 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-07-23 22:23:04 +0000 |
commit | 28e08a0a617c128259015614e8f90c98d2487ba6 (patch) | |
tree | 2ddee91cf7a77f1c79125ee99f9aaf5f0c78b1a7 /libcxxabi | |
parent | 247aac81abee8d7b4b9635347d0ab9a287e5b441 (diff) | |
download | bcm5719-llvm-28e08a0a617c128259015614e8f90c98d2487ba6.tar.gz bcm5719-llvm-28e08a0a617c128259015614e8f90c98d2487ba6.zip |
[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
llvm-svn: 337759
Diffstat (limited to 'libcxxabi')
-rw-r--r-- | libcxxabi/src/cxa_demangle.cpp | 17 | ||||
-rw-r--r-- | libcxxabi/src/demangle/Utility.h | 4 |
2 files changed, 17 insertions, 4 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp index 78d667117fd..9a2c83a9bec 100644 --- a/libcxxabi/src/cxa_demangle.cpp +++ b/libcxxabi/src/cxa_demangle.cpp @@ -1771,13 +1771,17 @@ class BumpPointerAllocator { BlockMeta* BlockList = nullptr; void grow() { - char* NewMeta = new char[AllocSize]; + char* NewMeta = static_cast<char *>(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<BlockMeta*>(new char[NBytes]); + BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(std::malloc(NBytes)); + if (NewMeta == nullptr) + std::terminate(); BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; return static_cast<void*>(NewMeta + 1); } @@ -1803,7 +1807,7 @@ public: BlockMeta* Tmp = BlockList; BlockList = BlockList->Next; if (reinterpret_cast<char*>(Tmp) != InitialBuffer) - delete[] reinterpret_cast<char*>(Tmp); + std::free(Tmp); } BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; } @@ -1833,10 +1837,15 @@ class PODSmallVector { size_t S = size(); if (isInline()) { auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T))); + if (Tmp == nullptr) + std::terminate(); std::copy(First, Last, Tmp); First = Tmp; - } else + } else { First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T))); + if (First == nullptr) + std::terminate(); + } Last = First + S; Cap = First + NewCap; } diff --git a/libcxxabi/src/demangle/Utility.h b/libcxxabi/src/demangle/Utility.h index a424c23b8ad..39092436283 100644 --- a/libcxxabi/src/demangle/Utility.h +++ b/libcxxabi/src/demangle/Utility.h @@ -35,6 +35,8 @@ class OutputStream { if (BufferCapacity < N + CurrentPosition) BufferCapacity = N + CurrentPosition; Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity)); + if (Buffer == nullptr) + std::terminate(); } } @@ -76,6 +78,8 @@ public: if (!StartBuf || !Size) { StartBuf = static_cast<char *>(std::malloc(AllocSize)); + if (StartBuf == nullptr) + std::terminate(); Size = &AllocSize; } |