From 4ce2c356262ecdf6995221433acb8449f871b202 Mon Sep 17 00:00:00 2001 From: paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Sat, 14 Oct 2006 09:51:32 +0000 Subject: [PATCH] 2006-10-14 Paolo Carlini <pcarlini@suse.de> * include/bits/ostream.tcc (operator<<(basic_ostream<>&, const char*)): Fix thinko in change for libstdc++/28277, avoid memory leaks. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117729 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 6 ++++++ libstdc++-v3/include/bits/ostream.tcc | 21 ++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9df166145286..f286f680be42 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2006-10-14 Paolo Carlini <pcarlini@suse.de> + + * include/bits/ostream.tcc (operator<<(basic_ostream<>&, + const char*)): Fix thinko in change for libstdc++/28277, + avoid memory leaks. + 2006-10-13 Paolo Carlini <pcarlini@suse.de> * include/bits/istream.tcc (operator>>(__istream_type& diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index 5bfde44dd3a8..125e0fe4cb8e 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -320,19 +320,30 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __out.setstate(ios_base::badbit); else { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 167. Improper use of traits_type::length() + const size_t __clen = char_traits<char>::length(__s); + _CharT* __ws = 0; + try + { __ws = new _CharT[__clen]; } + catch(...) + { + __out._M_setstate(ios_base::badbit); + return __out; + } + try { - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 167. Improper use of traits_type::length() - const size_t __clen = char_traits<char>::length(__s); - _CharT* __ws = new _CharT[__clen]; for (size_t __i = 0; __i < __clen; ++__i) __ws[__i] = __out.widen(__s[__i]); __out._M_insert(__ws, __clen); delete [] __ws; } catch(...) - { __out._M_setstate(ios_base::badbit); } + { + delete [] __ws; + __throw_exception_again; + } } return __out; } -- GitLab