PR libstdc++/85812 fix memory leak in std::make_exception_ptr
PR libstdc++/85812 * libsupc++/cxxabi_init_exception.h (__cxa_free_exception): Declare. * libsupc++/exception_ptr.h (make_exception_ptr) [__cpp_exceptions]: Refactor to separate non-throwing and throwing implementations. [__cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI]: Deallocate the memory if constructing the object throws. From-SVN: r260323
This commit is contained in:
parent
f1bcb061d1
commit
ff03245e00
|
@ -1,3 +1,12 @@
|
|||
2018-05-17 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/85812
|
||||
* libsupc++/cxxabi_init_exception.h (__cxa_free_exception): Declare.
|
||||
* libsupc++/exception_ptr.h (make_exception_ptr) [__cpp_exceptions]:
|
||||
Refactor to separate non-throwing and throwing implementations.
|
||||
[__cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI]: Deallocate the memory
|
||||
if constructing the object throws.
|
||||
|
||||
2018-05-15 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/85749
|
||||
|
|
|
@ -62,6 +62,9 @@ namespace __cxxabiv1
|
|||
void*
|
||||
__cxa_allocate_exception(size_t) _GLIBCXX_NOTHROW;
|
||||
|
||||
void
|
||||
__cxa_free_exception(void*) _GLIBCXX_NOTHROW;
|
||||
|
||||
// Initialize exception (this is a GNU extension)
|
||||
__cxa_refcounted_exception*
|
||||
__cxa_init_primary_exception(void *object, std::type_info *tinfo,
|
||||
|
|
|
@ -178,25 +178,31 @@ namespace std
|
|||
exception_ptr
|
||||
make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
|
||||
{
|
||||
#if __cpp_exceptions
|
||||
#if __cpp_exceptions && __cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI
|
||||
void* __e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex));
|
||||
(void) __cxxabiv1::__cxa_init_primary_exception(
|
||||
__e, const_cast<std::type_info*>(&typeid(__ex)),
|
||||
__exception_ptr::__dest_thunk<_Ex>);
|
||||
try
|
||||
{
|
||||
#if __cpp_rtti && !_GLIBCXX_HAVE_CDTOR_CALLABI
|
||||
void *__e = __cxxabiv1::__cxa_allocate_exception(sizeof(_Ex));
|
||||
(void)__cxxabiv1::__cxa_init_primary_exception(
|
||||
__e, const_cast<std::type_info*>(&typeid(__ex)),
|
||||
__exception_ptr::__dest_thunk<_Ex>);
|
||||
::new (__e) _Ex(__ex);
|
||||
return exception_ptr(__e);
|
||||
#else
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
__cxxabiv1::__cxa_free_exception(__e);
|
||||
return current_exception();
|
||||
}
|
||||
#elif __cpp_exceptions
|
||||
try
|
||||
{
|
||||
throw __ex;
|
||||
#endif
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return current_exception();
|
||||
}
|
||||
#else
|
||||
#else // no RTTI and no exceptions
|
||||
return exception_ptr();
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue