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:
Jonathan Wakely 2018-05-17 16:03:29 +01:00 committed by Jonathan Wakely
parent f1bcb061d1
commit ff03245e00
3 changed files with 27 additions and 9 deletions

View File

@ -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

View File

@ -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,

View File

@ -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
}