This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch] libstdc++/25421
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Thu, 15 Dec 2005 02:19:39 +0100
- Subject: [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);
}