From: Ulrich Drepper Date: Sat, 21 May 2011 06:06:45 +0000 (-0400) Subject: Fix handling of LC_CTYPE in locale name handling X-Git-Tag: glibc-2.14~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc9e536dac7171fa62b73700a01495cc6b269560;p=thirdparty%2Fglibc.git Fix handling of LC_CTYPE in locale name handling --- diff --git a/ChangeLog b/ChangeLog index 13376637150..7a91156ba24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-05-21 Ulrich Drepper + [BZ #12788] + * locale/setlocale.c (new_composite_name): Fix test to check for + identical name of all categories. + [BZ #12792] * libio/filedoalloc.c (local_isatty): New function. (_IO_file_doallocate): Use local_isatty. diff --git a/NEWS b/NEWS index ca0ee8f0216..5eb39e4b283 100644 --- a/NEWS +++ b/NEWS @@ -16,7 +16,7 @@ Version 2.14 12454, 12460, 12469, 12489, 12509, 12510, 12511, 12518, 12527, 12541, 12545, 12551, 12582, 12583, 12587, 12597, 12601, 12611, 12625, 12626, 12631, 12650, 12653, 12655, 12660, 12681, 12685, 12711, 12713, 12714, - 12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12792 + 12717, 12723, 12724, 12734, 12738, 12746, 12766, 12775, 12788, 12792 * The RPC implementation in libc is obsoleted. Old programs keep working but new programs cannot be linked with the routines in libc anymore. diff --git a/locale/setlocale.c b/locale/setlocale.c index 46372fdcac0..94e1c6480a7 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1995-2000, 2002, 2003, 2004, 2006, 2008, 2010 +/* Copyright (C) 1991, 1992, 1995-2000, 2002, 2003, 2004, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -155,7 +155,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST]) _nl_global_locale.__names[i]); last_len = strlen (name); cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1; - if (i > 0 && same && strcmp (name, newnames[0]) != 0) + if (same && name != newnames[0] && strcmp (name, newnames[0]) != 0) same = 0; } diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 705c351ecac..78965fbd0e5 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,9 @@ +2011-05-21 Ulrich Drepper + + [BZ #12788] + * bug-setlocale1.c: New file. + * Makefile: Add rules to build and run bug-setlocale1. + 2011-05-17 Ulrich Drepper [BZ #11837] diff --git a/localedata/Makefile b/localedata/Makefile index 8f356ec8614..81c1377420f 100644 --- a/localedata/Makefile +++ b/localedata/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1996-2003,2005,2007,2008,2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2003,2005,2007,2008,2009,2011 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -94,7 +94,7 @@ locale_test_suite := tst_iswalnum tst_iswalpha tst_iswcntrl \ tests = $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \ tst-leaks tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale \ - tst-strfmon1 tst-sscanf tst-strptime + tst-strfmon1 tst-sscanf tst-strptime bug-setlocale1 ifeq (yes,$(build-shared)) ifneq (no,$(PERL)) tests: $(objpfx)mtrace-tst-leaks @@ -301,5 +301,8 @@ tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace \ $(objpfx)mtrace-tst-leaks: $(objpfx)tst-leaks.out $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks.mtrace > $@ +bug-setlocale1-ENV = LOCPATH=$(common-objpfx)localedata +bug-setlocale1-ARGS = $(common-objpfx) + $(objdir)/iconvdata/gconv-modules: $(MAKE) -C ../iconvdata subdir=iconvdata $@ diff --git a/localedata/bug-setlocale1.c b/localedata/bug-setlocale1.c new file mode 100644 index 00000000000..cf787be02c0 --- /dev/null +++ b/localedata/bug-setlocale1.c @@ -0,0 +1,132 @@ +// BZ 12788 +#include +#include +#include +#include +#include + + +static int +do_test (int argc, char *argv[]) +{ + if (argc > 1) + { + char *newargv[5]; + asprintf (&newargv[0], "%self/ld.so", argv[1]); + if (newargv[0] == NULL) + { + puts ("asprintf failed"); + return 1; + } + newargv[1] = (char *) "--library-path"; + newargv[2] = argv[1]; + newargv[3] = argv[0]; + newargv[4] = NULL; + + char *env[3]; + env[0] = (char *) "LC_CTYPE=de_DE.UTF-8"; + char *loc = getenv ("LOCPATH"); + if (loc == NULL || loc[0] == '\0') + { + puts ("LOCPATH not set"); + return 1; + } + asprintf (&env[1], "LOCPATH=%s", loc); + if (newargv[0] == NULL) + { + puts ("second asprintf failed"); + return 1; + } + env[2] = NULL; + + execve (newargv[0], newargv, env); + + puts ("execve returned"); + return 1; + } + + int result = 0; + + char *a = setlocale (LC_ALL, ""); + printf ("setlocale(LC_ALL, \"\") = %s\n", a); + if (a == NULL) + return 1; + a = strdupa (a); + + char *b = setlocale (LC_CTYPE, ""); + printf ("setlocale(LC_CTYPE, \"\") = %s\n", b); + if (b == NULL) + return 1; + + char *c = setlocale (LC_ALL, NULL); + printf ("setlocale(LC_ALL, NULL) = %s\n", c); + if (c == NULL) + return 1; + c = strdupa (c); + + if (strcmp (a, c) != 0) + { + puts ("*** first and third result do not match"); + result = 1; + } + + char *d = setlocale (LC_NUMERIC, ""); + printf ("setlocale(LC_NUMERIC, \"\") = %s\n", d); + if (d == NULL) + return 1; + + if (strcmp (d, "C") != 0) + { + puts ("*** LC_NUMERIC not C"); + result = 1; + } + + char *e = setlocale (LC_ALL, NULL); + printf ("setlocale(LC_ALL, NULL) = %s\n", e); + if (e == NULL) + return 1; + + if (strcmp (a, e) != 0) + { + puts ("*** first and fifth result do not match"); + result = 1; + } + + char *f = setlocale (LC_ALL, "C"); + printf ("setlocale(LC_ALL, \"C\") = %s\n", f); + if (f == NULL) + return 1; + + if (strcmp (f, "C") != 0) + { + puts ("*** LC_ALL not C"); + result = 1; + } + + char *g = setlocale (LC_ALL, NULL); + printf ("setlocale(LC_ALL, NULL) = %s\n", g); + if (g == NULL) + return 1; + + if (strcmp (g, "C") != 0) + { + puts ("*** LC_ALL not C"); + result = 1; + } + + char *h = setlocale (LC_CTYPE, NULL); + printf ("setlocale(LC_CTYPE, NULL) = %s\n", h); + if (h == NULL) + return 1; + + if (strcmp (h, "C") != 0) + { + puts ("*** LC_CTYPE not C"); + result = 1; + } + + return result; +} + +#define TEST_FUNCTION do_test (argc, argv) +#include "../test-skeleton.c"