This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] libstdc++/25421


Hi,

the below one-liner is a minimal fix for the reported Segmentation
fault: what's happening is that when _S_create_c_locale throws during
the construction of the *_byname facets, __cloc is zero and the base
class destructor passes that zero to _S_destroy_c_locale (__freelocale
doesn't tolerate a null argument).

The patch is meant for 4_0 / 4_1 / mainline, but later, for mainline at
least, I'd like to work a bit more on the *_byname facets, because
probably we can simplify some constructors and thus also avoid very
easily a small memory leak under exceptions in messages_byname.

Tested x86-linux.

Paolo.

/////////////////
2005-12-15  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/25421
	* config/locale/gnu/c_locale.cc (_S_destroy_c_locale): Check
	for null argument.
	* testsuite/22_locale/facet/25421.cc: New.
Index: testsuite/22_locale/facet/25421.cc
===================================================================
--- testsuite/22_locale/facet/25421.cc	(revision 0)
+++ testsuite/22_locale/facet/25421.cc	(revision 0)
@@ -0,0 +1,67 @@
+// 2005-12-15  Paolo Carlini  <pcarlini@suse.de>
+
+// Copyright (C) 2005 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 22.1.1.1.2 - class locale::facet [lib.locale.facet]
+
+#include <stdexcept>
+#include <locale>
+#include <testsuite_hooks.h>
+
+// libstdc++/25421
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using namespace std;
+
+  try
+    {
+      new codecvt_byname<char, char, mbstate_t>("invalid-loc");
+      new collate_byname<char>("invalid-loc");
+      new ctype_byname<char>("invalid-loc");
+      new messages_byname<char>("invalid-loc");
+      new moneypunct_byname<char, true>("invalid-loc");
+      new numpunct_byname<char>("invalid-loc");
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+      new codecvt_byname<wchar_t, char, mbstate_t>("invalid-loc");
+      new collate_byname<wchar_t>("invalid-loc");
+      new ctype_byname<wchar_t>("invalid-loc");
+      new messages_byname<wchar_t>("invalid-loc");
+      new moneypunct_byname<wchar_t, true>("invalid-loc");
+      new numpunct_byname<wchar_t>("invalid-loc");
+#endif
+    }
+  catch(const std::runtime_error&)
+    {
+      // named locale not valid
+      VERIFY( true );
+    }
+  catch(...)
+    {
+      // some other error
+      VERIFY( false );
+    }
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
Index: config/locale/gnu/c_locale.cc
===================================================================
--- config/locale/gnu/c_locale.cc	(revision 108539)
+++ config/locale/gnu/c_locale.cc	(working copy)
@@ -100,7 +100,7 @@
   void
   locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
   {
-    if (_S_get_c_locale() != __cloc)
+    if (__cloc && _S_get_c_locale() != __cloc)
       __freelocale(__cloc); 
   }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]