diff --git a/glibc-testsuite.changes b/glibc-testsuite.changes index 1293151..5fe80fd 100644 --- a/glibc-testsuite.changes +++ b/glibc-testsuite.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Oct 12 08:12:10 UTC 2015 - schwab@suse.de + +- strcoll-remove-strdiff-opt.patch: Remove incorrect STRDIFF-based + optimization (BZ #18589) + +------------------------------------------------------------------- +Thu Oct 8 14:26:14 UTC 2015 - schwab@suse.de + +- iconv-reset-input-buffer.patch: Fix iconv buffer handling with IGNORE + error handler (BZ #18830) + ------------------------------------------------------------------- Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com diff --git a/glibc-testsuite.spec b/glibc-testsuite.spec index 9992adc..5f207e8 100644 --- a/glibc-testsuite.spec +++ b/glibc-testsuite.spec @@ -1,7 +1,7 @@ # # spec file for package glibc-testsuite # -# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -238,6 +238,8 @@ Patch1001: openat64-readd-o-largefile.patch Patch1002: mntent-blank-line.patch # PATCH-FIX-UPSTREAM Fix opendir inverted o_directory_works test (BZ #18921) Patch1003: opendir-o-directory-check.patch +# PATCH-FIX-UPSTREAM strcoll: Remove incorrect STRDIFF-based optimization (BZ #18589) +Patch1004: strcoll-remove-strdiff-opt.patch ### # Patches awaiting upstream approval @@ -258,8 +260,10 @@ Patch2007: static-dlopen.patch Patch2008: fnmatch-collating-elements.patch # PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991) Patch2009: nss-files-long-lines-2.patch -# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock +# PATCH-FIX-UPSTREAM PowerPC: Fix a race condition when eliding a lock (BZ #18743) Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch +# PATCH-FIX-UPSTREAM Fix iconv buffer handling with IGNORE error handler (BZ #18830) +Patch2011: iconv-reset-input-buffer.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -463,6 +467,7 @@ rm nscd/s-stamp %patch1001 -p1 %patch1002 -p1 %patch1003 -p1 +%patch1004 -p1 %patch2000 -p1 %patch2002 -p1 @@ -473,6 +478,7 @@ rm nscd/s-stamp %patch2008 -p1 %patch2009 -p1 %patch2010 -p1 +%patch2011 -p1 %patch3000 diff --git a/glibc-utils.changes b/glibc-utils.changes index 1293151..5fe80fd 100644 --- a/glibc-utils.changes +++ b/glibc-utils.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Oct 12 08:12:10 UTC 2015 - schwab@suse.de + +- strcoll-remove-strdiff-opt.patch: Remove incorrect STRDIFF-based + optimization (BZ #18589) + +------------------------------------------------------------------- +Thu Oct 8 14:26:14 UTC 2015 - schwab@suse.de + +- iconv-reset-input-buffer.patch: Fix iconv buffer handling with IGNORE + error handler (BZ #18830) + ------------------------------------------------------------------- Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com diff --git a/glibc-utils.spec b/glibc-utils.spec index 77800be..f2611bb 100644 --- a/glibc-utils.spec +++ b/glibc-utils.spec @@ -1,7 +1,7 @@ # # spec file for package glibc-utils # -# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -237,6 +237,8 @@ Patch1001: openat64-readd-o-largefile.patch Patch1002: mntent-blank-line.patch # PATCH-FIX-UPSTREAM Fix opendir inverted o_directory_works test (BZ #18921) Patch1003: opendir-o-directory-check.patch +# PATCH-FIX-UPSTREAM strcoll: Remove incorrect STRDIFF-based optimization (BZ #18589) +Patch1004: strcoll-remove-strdiff-opt.patch ### # Patches awaiting upstream approval @@ -257,8 +259,10 @@ Patch2007: static-dlopen.patch Patch2008: fnmatch-collating-elements.patch # PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991) Patch2009: nss-files-long-lines-2.patch -# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock +# PATCH-FIX-UPSTREAM PowerPC: Fix a race condition when eliding a lock (BZ #18743) Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch +# PATCH-FIX-UPSTREAM Fix iconv buffer handling with IGNORE error handler (BZ #18830) +Patch2011: iconv-reset-input-buffer.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -463,6 +467,7 @@ rm nscd/s-stamp %patch1001 -p1 %patch1002 -p1 %patch1003 -p1 +%patch1004 -p1 %patch2000 -p1 %patch2002 -p1 @@ -473,6 +478,7 @@ rm nscd/s-stamp %patch2008 -p1 %patch2009 -p1 %patch2010 -p1 +%patch2011 -p1 %patch3000 diff --git a/glibc.changes b/glibc.changes index 1293151..5fe80fd 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Oct 12 08:12:10 UTC 2015 - schwab@suse.de + +- strcoll-remove-strdiff-opt.patch: Remove incorrect STRDIFF-based + optimization (BZ #18589) + +------------------------------------------------------------------- +Thu Oct 8 14:26:14 UTC 2015 - schwab@suse.de + +- iconv-reset-input-buffer.patch: Fix iconv buffer handling with IGNORE + error handler (BZ #18830) + ------------------------------------------------------------------- Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com diff --git a/glibc.spec b/glibc.spec index ea3bc6c..c9980bb 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,7 +1,7 @@ # # spec file for package glibc # -# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -238,6 +238,8 @@ Patch1001: openat64-readd-o-largefile.patch Patch1002: mntent-blank-line.patch # PATCH-FIX-UPSTREAM Fix opendir inverted o_directory_works test (BZ #18921) Patch1003: opendir-o-directory-check.patch +# PATCH-FIX-UPSTREAM strcoll: Remove incorrect STRDIFF-based optimization (BZ #18589) +Patch1004: strcoll-remove-strdiff-opt.patch ### # Patches awaiting upstream approval @@ -258,8 +260,10 @@ Patch2007: static-dlopen.patch Patch2008: fnmatch-collating-elements.patch # PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991) Patch2009: nss-files-long-lines-2.patch -# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock +# PATCH-FIX-UPSTREAM PowerPC: Fix a race condition when eliding a lock (BZ #18743) Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch +# PATCH-FIX-UPSTREAM Fix iconv buffer handling with IGNORE error handler (BZ #18830) +Patch2011: iconv-reset-input-buffer.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -463,6 +467,7 @@ rm nscd/s-stamp %patch1001 -p1 %patch1002 -p1 %patch1003 -p1 +%patch1004 -p1 %patch2000 -p1 %patch2002 -p1 @@ -473,6 +478,7 @@ rm nscd/s-stamp %patch2008 -p1 %patch2009 -p1 %patch2010 -p1 +%patch2011 -p1 %patch3000 diff --git a/iconv-reset-input-buffer.patch b/iconv-reset-input-buffer.patch new file mode 100644 index 0000000..86d6811 --- /dev/null +++ b/iconv-reset-input-buffer.patch @@ -0,0 +1,298 @@ +Fix iconv buffer handling with IGNORE error handler (bug #18830) + + [BZ #18830] + * iconv/skeleton.c (FUNCTION_NAME): Use RESET_INPUT_BUFFER only if + no irreversible characters occurred. + * iconv/gconv_simple.c (internal_ucs4_loop) + (internal_ucs4_loop_unaligned, internal_ucs4_loop_single) + (ucs4_internal_loop, ucs4_internal_loop_unaligned) + (ucs4_internal_loop_single, internal_ucs4le_loop) + (internal_ucs4le_loop_unaligned, internal_ucs4le_loop_single) + (ucs4le_internal_loop, ucs4le_internal_loop_unaligned) + (ucs4le_internal_loop_single): Add const to outend. + * iconv/Makefile (tests): Add tst-iconv6. + * iconv/tst-iconv6.c: New file. + +Index: glibc-2.22/iconv/Makefile +=================================================================== +--- glibc-2.22.orig/iconv/Makefile ++++ glibc-2.22/iconv/Makefile +@@ -42,7 +42,7 @@ CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i1 + CFLAGS-linereader.c = -DNO_TRANSLITERATION + CFLAGS-simple-hash.c = -I../locale + +-tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 ++tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6 + + others = iconv_prog iconvconfig + install-others-programs = $(inst_bindir)/iconv +Index: glibc-2.22/iconv/gconv_simple.c +=================================================================== +--- glibc-2.22.orig/iconv/gconv_simple.c ++++ glibc-2.22/iconv/gconv_simple.c +@@ -76,7 +76,7 @@ __attribute ((always_inline)) + internal_ucs4_loop (struct __gconv_step *step, + struct __gconv_step_data *step_data, + const unsigned char **inptrp, const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, const unsigned char *outend, + size_t *irreversible) + { + const unsigned char *inptr = *inptrp; +@@ -120,7 +120,8 @@ internal_ucs4_loop_unaligned (struct __g + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + const unsigned char *inptr = *inptrp; +@@ -169,7 +170,8 @@ internal_ucs4_loop_single (struct __gcon + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + mbstate_t *state = step_data->__statep; +@@ -231,7 +233,7 @@ __attribute ((always_inline)) + ucs4_internal_loop (struct __gconv_step *step, + struct __gconv_step_data *step_data, + const unsigned char **inptrp, const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, const unsigned char *outend, + size_t *irreversible) + { + int flags = step_data->__flags; +@@ -298,7 +300,8 @@ ucs4_internal_loop_unaligned (struct __g + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + int flags = step_data->__flags; +@@ -368,7 +371,8 @@ ucs4_internal_loop_single (struct __gcon + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + mbstate_t *state = step_data->__statep; +@@ -443,7 +447,7 @@ __attribute ((always_inline)) + internal_ucs4le_loop (struct __gconv_step *step, + struct __gconv_step_data *step_data, + const unsigned char **inptrp, const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, const unsigned char *outend, + size_t *irreversible) + { + const unsigned char *inptr = *inptrp; +@@ -488,7 +492,8 @@ internal_ucs4le_loop_unaligned (struct _ + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + const unsigned char *inptr = *inptrp; +@@ -540,7 +545,8 @@ internal_ucs4le_loop_single (struct __gc + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + mbstate_t *state = step_data->__statep; +@@ -601,7 +607,7 @@ __attribute ((always_inline)) + ucs4le_internal_loop (struct __gconv_step *step, + struct __gconv_step_data *step_data, + const unsigned char **inptrp, const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, const unsigned char *outend, + size_t *irreversible) + { + int flags = step_data->__flags; +@@ -669,7 +675,8 @@ ucs4le_internal_loop_unaligned (struct _ + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + int flags = step_data->__flags; +@@ -743,7 +750,8 @@ ucs4le_internal_loop_single (struct __gc + struct __gconv_step_data *step_data, + const unsigned char **inptrp, + const unsigned char *inend, +- unsigned char **outptrp, unsigned char *outend, ++ unsigned char **outptrp, ++ const unsigned char *outend, + size_t *irreversible) + { + mbstate_t *state = step_data->__statep; +Index: glibc-2.22/iconv/skeleton.c +=================================================================== +--- glibc-2.22.orig/iconv/skeleton.c ++++ glibc-2.22/iconv/skeleton.c +@@ -597,6 +597,10 @@ FUNCTION_NAME (struct __gconv_step *step + inptr = *inptrp; + /* The outbuf buffer is empty. */ + outstart = outbuf; ++#ifdef RESET_INPUT_BUFFER ++ size_t loop_irreversible ++ = lirreversible + (irreversible ? *irreversible : 0); ++#endif + + #ifdef SAVE_RESET_STATE + SAVE_RESET_STATE (1); +@@ -671,8 +675,16 @@ FUNCTION_NAME (struct __gconv_step *step + if (__glibc_unlikely (outerr != outbuf)) + { + #ifdef RESET_INPUT_BUFFER +- RESET_INPUT_BUFFER; +-#else ++ if (loop_irreversible ++ == lirreversible + (irreversible ? *irreversible : 0)) ++ { ++ /* RESET_INPUT_BUFFER can only work if there ++ were no irreversible characters during the ++ last loop. */ ++ RESET_INPUT_BUFFER; ++ goto done_reset; ++ } ++#endif + /* We have a problem in one of the functions below. + Undo the conversion upto the error point. */ + size_t nstatus; +@@ -682,9 +694,9 @@ FUNCTION_NAME (struct __gconv_step *step + outbuf = outstart; + + /* Restore the state. */ +-# ifdef SAVE_RESET_STATE ++#ifdef SAVE_RESET_STATE + SAVE_RESET_STATE (0); +-# endif ++#endif + + if (__glibc_likely (!unaligned)) + { +@@ -701,7 +713,7 @@ FUNCTION_NAME (struct __gconv_step *step + lirreversiblep + EXTRA_LOOP_ARGS); + } +-# if POSSIBLY_UNALIGNED ++#if POSSIBLY_UNALIGNED + else + { + if (FROM_DIRECTION) +@@ -720,7 +732,7 @@ FUNCTION_NAME (struct __gconv_step *step + lirreversiblep + EXTRA_LOOP_ARGS); + } +-# endif ++#endif + + /* We must run out of output buffer space in this + rerun. */ +@@ -731,9 +743,11 @@ FUNCTION_NAME (struct __gconv_step *step + the invocation counter. */ + if (__glibc_unlikely (outbuf == outstart)) + --data->__invocation_counter; +-#endif /* reset input buffer */ + } + ++#ifdef RESET_INPUT_BUFFER ++ done_reset: ++#endif + /* Change the status. */ + status = result; + } +Index: glibc-2.22/iconv/tst-iconv6.c +=================================================================== +--- /dev/null ++++ glibc-2.22/iconv/tst-iconv6.c +@@ -0,0 +1,68 @@ ++/* Test iconv buffer handling with the IGNORE error handler. ++ Copyright (C) 2015 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* Derived from BZ #18830 */ ++#include ++#include ++#include ++ ++ ++static int ++do_test (void) ++{ ++ iconv_t cd = iconv_open ("ASCII//IGNORE", "ASCII"); ++ if (cd == (iconv_t) -1) ++ { ++ puts ("iconv_open failed"); ++ return 1; ++ } ++ ++ char input[5 + 3] = { 0, 0, 0, 0, 0, '1', '\200', '2' }; ++ char *inptr = input; ++ size_t insize = sizeof (input); ++ char output[5]; ++ char *outptr = output; ++ size_t outsize = sizeof (output); ++ ++ size_t ret = iconv (cd, &inptr, &insize, &outptr, &outsize); ++ if (ret != (size_t) -1) ++ { ++ puts ("iconv succeeded"); ++ return 1; ++ } ++ if (errno != E2BIG) ++ { ++ puts ("iconv did not set errno to E2BIG"); ++ return 1; ++ } ++ if (inptr != input + sizeof (output) - outsize) ++ { ++ printf ("iconv consumed %td characters\n", inptr - input); ++ return 1; ++ } ++ ++ if (iconv_close (cd) == -1) ++ { ++ puts ("iconv_close failed"); ++ return 1; ++ } ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/strcoll-remove-strdiff-opt.patch b/strcoll-remove-strdiff-opt.patch new file mode 100644 index 0000000..832258c --- /dev/null +++ b/strcoll-remove-strdiff-opt.patch @@ -0,0 +1,366 @@ +2015-10-09 Carlos O'Donell + + [BZ #18589] + * string/bug-strcoll2.c: Adjust copyright, and remove contributed by. + * string/Makefile ($(objpfx)bug-strcoll2.out): Depend on + $(gen-locales). + +2015-10-08 Carlos O'Donell + + [BZ #18589] + * string/Makefile (tests): Add bug-strcoll2. + (LOCALES): Add cs_CZ.UTF-8. + +2015-09-28 Martin Sebor + + [BZ #18969] + * string/Makefile (LOCALES): Define. + (gen-locales.mk): Include. + (test-strcasecmp.out, test-strncasecmp.out, tst-strxfrm.out) + (tst-strxfrm2.out): Add deppendency on $(gen-locales). + * string/tst-strxfrm2.c (do_test): Print the name of the locale + on setlocale failure. + +2015-10-08 Carlos O'Donell + + [BZ #18589] + * string/bug-strcoll2.c: New file. + * locale/categories.def: Revert commit + f13c2a8dff2329c6692a80176262ceaaf8a6f74e. + * locale/langinfo.h: Likewise. + * locale/localeinfo.h: Likewise. + * locale/C-collate.c: Likewise. + * programs/ld-collate.c (collate_output): Likewise. + * string/strcoll_l.c (STRDIFF): Likewise. + (STRCOLL): Likewise. + * wcsmbs/wcscoll_l.c: Likewise. + +Index: glibc-2.22/locale/C-collate.c +=================================================================== +--- glibc-2.22.orig/locale/C-collate.c ++++ glibc-2.22/locale/C-collate.c +@@ -144,8 +144,6 @@ const struct __locale_data _nl_C_LC_COLL + /* _NL_COLLATE_COLLSEQWC */ + { .string = (const char *) collseqwc }, + /* _NL_COLLATE_CODESET */ +- { .string = _nl_C_codeset }, +- /* _NL_COLLATE_ENCODING_TYPE */ +- { .word = __cet_8bit } ++ { .string = _nl_C_codeset } + } + }; +Index: glibc-2.22/locale/categories.def +=================================================================== +--- glibc-2.22.orig/locale/categories.def ++++ glibc-2.22/locale/categories.def +@@ -58,7 +58,6 @@ DEFINE_CATEGORY + DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB, "collate-collseqmb", std, wstring) + DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC, "collate-collseqwc", std, wstring) + DEFINE_ELEMENT (_NL_COLLATE_CODESET, "collate-codeset", std, string) +- DEFINE_ELEMENT (_NL_COLLATE_ENCODING_TYPE, "collate-encoding-type", std, word) + ), NO_POSTLOAD) + + +Index: glibc-2.22/locale/langinfo.h +=================================================================== +--- glibc-2.22.orig/locale/langinfo.h ++++ glibc-2.22/locale/langinfo.h +@@ -255,7 +255,6 @@ enum + _NL_COLLATE_COLLSEQMB, + _NL_COLLATE_COLLSEQWC, + _NL_COLLATE_CODESET, +- _NL_COLLATE_ENCODING_TYPE, + _NL_NUM_LC_COLLATE, + + /* LC_CTYPE category: character classification. +Index: glibc-2.22/locale/localeinfo.h +=================================================================== +--- glibc-2.22.orig/locale/localeinfo.h ++++ glibc-2.22/locale/localeinfo.h +@@ -110,14 +110,6 @@ enum coll_sort_rule + sort_mask + }; + +-/* Collation encoding type. */ +-enum collation_encoding_type +-{ +- __cet_other, +- __cet_8bit, +- __cet_utf8 +-}; +- + /* We can map the types of the entries into a few categories. */ + enum value_type + { +Index: glibc-2.22/locale/programs/ld-collate.c +=================================================================== +--- glibc-2.22.orig/locale/programs/ld-collate.c ++++ glibc-2.22/locale/programs/ld-collate.c +@@ -32,7 +32,6 @@ + #include "linereader.h" + #include "locfile.h" + #include "elem-hash.h" +-#include "../localeinfo.h" + + /* Uncomment the following line in the production version. */ + /* #define NDEBUG 1 */ +@@ -2131,8 +2130,6 @@ collate_output (struct localedef_t *loca + /* The words have to be handled specially. */ + if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB)) + add_locale_uint32 (&file, 0); +- else if (idx == _NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)) +- add_locale_uint32 (&file, __cet_other); + else + add_locale_empty (&file); + } +@@ -2496,12 +2493,6 @@ collate_output (struct localedef_t *loca + add_locale_raw_data (&file, collate->mbseqorder, 256); + add_locale_collseq_table (&file, &collate->wcseqorder); + add_locale_string (&file, charmap->code_set_name); +- if (strcmp (charmap->code_set_name, "UTF-8") == 0) +- add_locale_uint32 (&file, __cet_utf8); +- else if (charmap->mb_cur_max == 1) +- add_locale_uint32 (&file, __cet_8bit); +- else +- add_locale_uint32 (&file, __cet_other); + write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file); + + obstack_free (&weightpool, NULL); +Index: glibc-2.22/string/Makefile +=================================================================== +--- glibc-2.22.orig/string/Makefile ++++ glibc-2.22/string/Makefile +@@ -54,7 +54,7 @@ tests := tester inl-tester noinl-tester + tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ + bug-strtok1 $(addprefix test-,$(strop-tests)) \ + bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ +- tst-strtok_r ++ tst-strtok_r bug-strcoll2 + + xtests = tst-strcoll-overflow + +@@ -75,4 +75,17 @@ ifeq ($(run-built-tests),yes) + $(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out + cmp $^ > $@; \ + $(evaluate-test) ++ ++LOCALES := de_DE.UTF-8 en_US.ISO-8859-1 en_US.UTF-8 \ ++ tr_TR.ISO-8859-9 tr_TR.UTF-8 cs_CZ.UTF-8 \ ++ da_DK.ISO-8859-1 ++include ../gen-locales.mk ++ ++$(objpfx)test-strcasecmp.out: $(gen-locales) ++$(objpfx)test-strncasecmp.out: $(gen-locales) ++$(objpfx)tst-strxfrm.out: $(gen-locales) ++$(objpfx)tst-strxfrm2.out: $(gen-locales) ++# bug-strcoll2 needs cs_CZ.UTF-8 and da_DK.ISO-8859-1. ++$(objpfx)bug-strcoll2.out: $(gen-locales) ++ + endif +Index: glibc-2.22/string/bug-strcoll2.c +=================================================================== +--- /dev/null ++++ glibc-2.22/string/bug-strcoll2.c +@@ -0,0 +1,92 @@ ++/* Bug 18589: sort-test.sh fails at random. ++ Copyright (C) 2015 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 ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++ ++/* An incorrect strcoll optimization resulted in incorrect ++ results from strcoll for cs_CZ and da_DK. */ ++ ++int ++test_cs_CZ (void) ++{ ++ const char t1[] = "config"; ++ const char t2[] = "choose"; ++ if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) ++ { ++ perror ("setlocale"); ++ return 1; ++ } ++ /* In Czech the digraph ch sorts after c, therefore we expect ++ config to sort before choose. */ ++ int a = strcoll (t1, t2); ++ int b = strcoll (t2, t1); ++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); ++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); ++ if (a < 0 && b > 0) ++ { ++ puts ("PASS: config < choose"); ++ return 0; ++ } ++ else ++ { ++ puts ("FAIL: Wrong sorting in cs_CZ.UTF-8."); ++ return 1; ++ } ++} ++ ++int ++test_da_DK (void) ++{ ++ const char t1[] = "AS"; ++ const char t2[] = "AA"; ++ if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL) ++ { ++ perror ("setlocale"); ++ return 1; ++ } ++ /* AA should be treated as the last letter of the Danish alphabet, ++ hence sorting after AS. */ ++ int a = strcoll (t1, t2); ++ int b = strcoll (t2, t1); ++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); ++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); ++ if (a < 0 && b > 0) ++ { ++ puts ("PASS: AS < AA"); ++ return 0; ++ } ++ else ++ { ++ puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1"); ++ return 1; ++ } ++} ++ ++static int ++do_test (void) ++{ ++ int err = 0; ++ err |= test_cs_CZ (); ++ err |= test_da_DK (); ++ return err; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +Index: glibc-2.22/string/strcoll_l.c +=================================================================== +--- glibc-2.22.orig/string/strcoll_l.c ++++ glibc-2.22/string/strcoll_l.c +@@ -29,7 +29,6 @@ + # define STRING_TYPE char + # define USTRING_TYPE unsigned char + # define STRCOLL __strcoll_l +-# define STRDIFF __strdiff + # define STRCMP strcmp + # define WEIGHT_H "../locale/weight.h" + # define SUFFIX MB +@@ -42,20 +41,6 @@ + #include "../locale/localeinfo.h" + #include WEIGHT_H + +-#define MASK_UTF8_7BIT (1 << 7) +-#define MASK_UTF8_START (3 << 6) +- +-size_t +-STRDIFF (const STRING_TYPE *s, const STRING_TYPE *t) +-{ +- size_t n; +- +- for (n = 0; *s != '\0' && *s++ == *t++; ++n) +- continue; +- +- return n; +-} +- + /* Track status while looking for sequences in a string. */ + typedef struct + { +@@ -269,29 +254,9 @@ STRCOLL (const STRING_TYPE *s1, const ST + const USTRING_TYPE *extra; + const int32_t *indirect; + +- /* In case there is no locale specific sort order (C / POSIX). */ + if (nrules == 0) + return STRCMP (s1, s2); + +- /* Fast forward to the position of the first difference. Needs to be +- encoding aware as the byte-by-byte comparison can stop in the middle +- of a char sequence for multibyte encodings like UTF-8. */ +- uint_fast32_t encoding = +- current->values[_NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)].word; +- if (encoding != __cet_other) +- { +- size_t diff = STRDIFF (s1, s2); +- if (diff > 0) +- { +- if (encoding == __cet_utf8 && (*(s1 + diff) & MASK_UTF8_7BIT) != 0) +- do +- diff--; +- while (diff > 0 && (*(s1 + diff) & MASK_UTF8_START) != MASK_UTF8_START); +- s1 += diff; +- s2 += diff; +- } +- } +- + /* Catch empty strings. */ + if (__glibc_unlikely (*s1 == '\0') || __glibc_unlikely (*s2 == '\0')) + return (*s1 != '\0') - (*s2 != '\0'); +@@ -358,8 +323,7 @@ STRCOLL (const STRING_TYPE *s1, const ST + byte-level comparison to ensure that we don't waste time + going through multiple passes for totally equal strings + before proceeding to subsequent passes. */ +- if (pass == 0 && encoding == __cet_other && +- STRCMP (s1, s2) == 0) ++ if (pass == 0 && STRCMP (s1, s2) == 0) + return result; + else + break; +Index: glibc-2.22/string/tst-strxfrm2.c +=================================================================== +--- glibc-2.22.orig/string/tst-strxfrm2.c ++++ glibc-2.22/string/tst-strxfrm2.c +@@ -5,6 +5,8 @@ + static int + do_test (void) + { ++ static const char test_locale[] = "de_DE.UTF-8"; ++ + int res = 0; + + char buf[20]; +@@ -38,9 +40,9 @@ do_test (void) + res = 1; + } + +- if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) ++ if (setlocale (LC_ALL, test_locale) == NULL) + { +- puts ("setlocale failed"); ++ printf ("cannot set locale \"%s\"\n", test_locale); + res = 1; + } + else +Index: glibc-2.22/wcsmbs/wcscoll_l.c +=================================================================== +--- glibc-2.22.orig/wcsmbs/wcscoll_l.c ++++ glibc-2.22/wcsmbs/wcscoll_l.c +@@ -23,7 +23,6 @@ + #define STRING_TYPE wchar_t + #define USTRING_TYPE wint_t + #define STRCOLL __wcscoll_l +-#define STRDIFF __wcsdiff + #define STRCMP __wcscmp + #define WEIGHT_H "../locale/weightwc.h" + #define SUFFIX WC