]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/85812 fix memory leak in std::make_exception_ptr
authorJonathan Wakely <jwakely@redhat.com>
Thu, 17 May 2018 17:26:44 +0000 (18:26 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 17 May 2018 17:26:44 +0000 (18:26 +0100)
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: r260331

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/cxxabi_init_exception.h
libstdc++-v3/libsupc++/exception_ptr.h

index a3a55e54ee83214a348dd5a77e4f280d56a8d2ae..de8f0dab995e3606f50e85bd07694c9197688e7e 100644 (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-14  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/67554
index bf7b4bada817011301a0f785c6a293217a4f69ec..2cf2c257ea8d4dd1c69e42c1a5bd7f7d1213fe40 100644 (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,
index 0ece81d8137a0db1910342a99b52d335a0b765da..faae9b77cb328331334842b62f43decd9467913f 100644 (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
     }