aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-05-17 16:03:29 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-05-17 16:03:29 +0100
commitff03245e00af4448173fb5c11420876345e832f3 (patch)
tree012b0c91f48ccf16f484697d398f4d10e71ad096
parentf1bcb061d172ca7e3bdcc46476b20776382a2974 (diff)
downloadgcc-ff03245e00af4448173fb5c11420876345e832f3.zip
gcc-ff03245e00af4448173fb5c11420876345e832f3.tar.gz
gcc-ff03245e00af4448173fb5c11420876345e832f3.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/libsupc++/cxxabi_init_exception.h3
-rw-r--r--libstdc++-v3/libsupc++/exception_ptr.h24
3 files changed, 27 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 8359f4f..142f7c8 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/libsupc++/cxxabi_init_exception.h b/libstdc++-v3/libsupc++/cxxabi_init_exception.h
index d973a08..e438c10 100644
--- a/libstdc++-v3/libsupc++/cxxabi_init_exception.h
+++ b/libstdc++-v3/libsupc++/cxxabi_init_exception.h
@@ -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,
diff --git a/libstdc++-v3/libsupc++/exception_ptr.h b/libstdc++-v3/libsupc++/exception_ptr.h
index a927327..bd355ed 100644
--- a/libstdc++-v3/libsupc++/exception_ptr.h
+++ b/libstdc++-v3/libsupc++/exception_ptr.h
@@ -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
}