[Support] Report OOM from allocate_buffer (#85449)
Previously, it called `::operator new` which may throw `std::bad_alloc`, regardless of whether LLVM itself was built with exception handling, and this can cause safety issues if outside code has destructors that will call back into LLVM. Now we use `::operator new(..., nothrow)` and call `llvm::report_bad_alloc_error` when allocation fails, which will abort when LLVM is built without exceptions. Ref: https://github.com/llvm/llvm-project/issues/85281
This commit is contained in:
parent
08c364280a
commit
b80965efc1
@ -13,12 +13,15 @@
|
||||
|
||||
LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void *
|
||||
llvm::allocate_buffer(size_t Size, size_t Alignment) {
|
||||
return ::operator new(Size
|
||||
void *Result = ::operator new(Size,
|
||||
#ifdef __cpp_aligned_new
|
||||
,
|
||||
std::align_val_t(Alignment)
|
||||
std::align_val_t(Alignment),
|
||||
#endif
|
||||
);
|
||||
std::nothrow);
|
||||
if (Result == nullptr) {
|
||||
report_bad_alloc_error("Buffer allocation failed");
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
void llvm::deallocate_buffer(void *Ptr, size_t Size, size_t Alignment) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user