Fix a regression introduced by the fix of libstdc++/68276.
authorVille Voutilainen <ville.voutilainen@gmail.com>
Fri, 18 Dec 2015 21:27:53 +0000 (23:27 +0200)
committerVille Voutilainen <ville@gcc.gnu.org>
Fri, 18 Dec 2015 21:27:53 +0000 (23:27 +0200)
2015-12-18  Ville Voutilainen  <ville.voutilainen@gmail.com>

Fix a regression introduced by the fix of libstdc++/68276.
* src/c++11/ios.cc (_M_grow_words): Catch bad_alloc again so that
bad_array_new_length is handled properly.

From-SVN: r231839

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++11/ios.cc

index a37878d7867083a13f91d704984bec7205401d4a..c4f9f3c2e0a37f55e6395896f499256ad548c4fd 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-18  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Fix a regression introduced by the fix of libstdc++/68276.
+       * src/c++11/ios.cc (_M_grow_words): Catch bad_alloc again so that
+       bad_array_new_length is handled properly.
+
 2015-12-18  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
        PR libstdc++/68276
index f701e61f0d0cb9a61a420f57826c6a86bc3ecfce..17dad5595733ed48829e6ae6ac50c4fbdd34fe34 100644 (file)
@@ -121,7 +121,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        if (__ix < numeric_limits<int>::max())
          {
            __newsize = __ix + 1;
-           __words = new (std::nothrow) _Words[__newsize];
+           /* We still need to catch bad_alloc even though we use
+              a nothrow new, because the new-expression can throw
+              a bad_array_new_length.  */
+           __try
+             { __words = new (std::nothrow) _Words[__newsize]; }
+           __catch(const std::bad_alloc&)
+             { __words = nullptr; }
            if (!__words)
              {
                _M_streambuf_state |= badbit;