diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 9df166145286122f55ea6ba4e0acd2ea3c93bc10..f286f680be42fcc047c4bdde1706f290862ab4b4 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 5bfde44dd3a8547f561fcfef0ab86a8d986de6fc..125e0fe4cb8e45cf770eb8f9fab6581acb1c59ba 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;
     }