aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-12-14 11:58:05 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-12-14 14:11:13 +0000
commit881c6cabce5d0b27285ed41bd6dabdf48848cce7 (patch)
tree120144de4b28ff24416eb315fba91a2747635264
parent049dccd080c6ad74a8d0923c57c8a488a9a18496 (diff)
downloadgcc-881c6cabce5d0b27285ed41bd6dabdf48848cce7.zip
gcc-881c6cabce5d0b27285ed41bd6dabdf48848cce7.tar.gz
gcc-881c6cabce5d0b27285ed41bd6dabdf48848cce7.tar.bz2
libstdc++: Fix size passed to operator delete [PR108097]
The number of elements gets stored in _M_capacity so use a separate variable for the number of bytes to allocate. libstdc++-v3/ChangeLog: PR libstdc++/108097 * include/std/stacktrace (basic_stracktrace::_Impl): Do not multiply N by sizeof(value_type) when allocating.
-rw-r--r--libstdc++-v3/include/std/stacktrace6
1 files changed, 4 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/stacktrace b/libstdc++-v3/include/std/stacktrace
index 83c6463..402be3e 100644
--- a/libstdc++-v3/include/std/stacktrace
+++ b/libstdc++-v3/include/std/stacktrace
@@ -608,8 +608,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
if constexpr (is_same_v<allocator_type, allocator<value_type>>)
{
- __n *= sizeof(value_type);
- void* const __p = _GLIBCXX_OPERATOR_NEW (__n, nothrow_t{});
+ // For std::allocator we use nothrow-new directly so we
+ // don't need to handle bad_alloc exceptions.
+ size_t __nb = __n * sizeof(value_type);
+ void* const __p = _GLIBCXX_OPERATOR_NEW (__nb, nothrow_t{});
if (__p == nullptr) [[unlikely]]
return nullptr;
_M_frames = static_cast<pointer>(__p);