djdelorie / rpms / glibc

Forked from rpms/glibc 3 years ago
Clone
Carlos O'Donell 7a808bc
Description: Remove incorrect strcoll implementation.
Carlos O'Donell 7a808bc
Author: Carlos O'Donell <codonell@redhat.com>
Carlos O'Donell 7a808bc
Origin: git://sourceware.org/glibc.git
Carlos O'Donell 7a808bc
Bug-RHEL: N/A
Carlos O'Donell 7a808bc
Bug-Fedora: #1276711
Carlos O'Donell 7a808bc
Bug-Upstream: #18589
Carlos O'Donell 7a808bc
Upstream status: committed
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
commit 60cf80f09d029257caedc0c8abe7e3e09c64e6c7
Carlos O'Donell 7a808bc
Author: Martin Sebor <msebor@gcc.gnu.org>
Carlos O'Donell 7a808bc
Date:   Mon Sep 28 16:55:57 2015 -0400
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
    Let 'make check subdirs=string' succeed even when it's invoked
Carlos O'Donell 7a808bc
    immediately after glibc has been built and before 'make check'
Carlos O'Donell 7a808bc
    (or after 'make clean').
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
commit facdd9ea29ab94aac2b188ec3cc41f8733d769e0
Carlos O'Donell 7a808bc
Author: Carlos O'Donell <carlos@systemhalted.org>
Carlos O'Donell 7a808bc
Date:   Fri Oct 9 16:35:53 2015 -0400
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
    Fix typo in bug-strcoll2 (Bug 18589)
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    Fix the copyright year and remove contributed by in the
Carlos O'Donell 7a808bc
    bug-strcoll2 test. In addition add the correct dependency
Carlos O'Donell 7a808bc
    on $(gen-locales) to ensure all the test locales are generated.
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
commit 02018629a1397d03eccceacaf2ee1c50e3c4001c
Carlos O'Donell 7a808bc
Author: Carlos O'Donell <carlos@systemhalted.org>
Carlos O'Donell 7a808bc
Date:   Thu Oct 8 16:54:30 2015 -0400
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
    strcoll: Add bug-strcoll2 to testsuite (Bug 18589).
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    Adds bug-strcoll2 to the string tests, along with the
Carlos O'Donell 7a808bc
    generation of required locales.
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
commit 87701a58e291bd7ac3b407d10a829dac52c9c16e
Carlos O'Donell 7a808bc
Author: Carlos O'Donell <carlos@systemhalted.org>
Carlos O'Donell 7a808bc
Date:   Thu Oct 8 16:34:53 2015 -0400
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
    strcoll: Remove incorrect STRDIFF-based optimization (Bug 18589).
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    The optimization introduced in commit
Carlos O'Donell 7a808bc
    f13c2a8dff2329c6692a80176262ceaaf8a6f74e, causes regressions in
Carlos O'Donell 7a808bc
    sorting for languages that have digraphs that change sort order, like
Carlos O'Donell 7a808bc
    cs_CZ which sorts ch between h and i.
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    My analysis shows the fast-forwarding optimization in STRCOLL advances
Carlos O'Donell 7a808bc
    through a digraph while possibly stopping in the middle which results
Carlos O'Donell 7a808bc
    in a subsequent skipping of the digraph and incorrect sorting. The
Carlos O'Donell 7a808bc
    optimization is incorrect as implemented and because of that I'm
Carlos O'Donell 7a808bc
    removing it for 2.23, and I will also commit this fix for 2.22 where
Carlos O'Donell 7a808bc
    it was originally introduced.
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    This patch reverts the optimization, introduces a new bug-strcoll2.c
Carlos O'Donell 7a808bc
    regression test that tests both cs_CZ.UTF-8 and da_DK.ISO-8859-1 and
Carlos O'Donell 7a808bc
    ensures they sort one digraph each correctly. The optimization can't be
Carlos O'Donell 7a808bc
    applied without regressing this test.
Carlos O'Donell 7a808bc
    
Carlos O'Donell 7a808bc
    Checked on x86_64, bug-strcoll2.c fails without this patch and passes
Carlos O'Donell 7a808bc
    after. This will also get a fix on 2.22 which has the same bug.
Carlos O'Donell 7a808bc
Carlos O'Donell 7a808bc
Index: glibc-2.22/locale/C-collate.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/locale/C-collate.c
Carlos O'Donell 7a808bc
+++ glibc-2.22/locale/C-collate.c
Carlos O'Donell 7a808bc
@@ -144,8 +144,6 @@ const struct __locale_data _nl_C_LC_COLL
Carlos O'Donell 7a808bc
     /* _NL_COLLATE_COLLSEQWC */
Carlos O'Donell 7a808bc
     { .string = (const char *) collseqwc },
Carlos O'Donell 7a808bc
     /* _NL_COLLATE_CODESET */
Carlos O'Donell 7a808bc
-    { .string = _nl_C_codeset },
Carlos O'Donell 7a808bc
-    /* _NL_COLLATE_ENCODING_TYPE */
Carlos O'Donell 7a808bc
-    { .word = __cet_8bit }
Carlos O'Donell 7a808bc
+    { .string = _nl_C_codeset }
Carlos O'Donell 7a808bc
   }
Carlos O'Donell 7a808bc
 };
Carlos O'Donell 7a808bc
Index: glibc-2.22/locale/categories.def
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/locale/categories.def
Carlos O'Donell 7a808bc
+++ glibc-2.22/locale/categories.def
Carlos O'Donell 7a808bc
@@ -58,7 +58,6 @@ DEFINE_CATEGORY
Carlos O'Donell 7a808bc
   DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB,        "collate-collseqmb",        std, wstring)
Carlos O'Donell 7a808bc
   DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC,        "collate-collseqwc",        std, wstring)
Carlos O'Donell 7a808bc
   DEFINE_ELEMENT (_NL_COLLATE_CODESET,		"collate-codeset",	    std, string)
Carlos O'Donell 7a808bc
-  DEFINE_ELEMENT (_NL_COLLATE_ENCODING_TYPE,   "collate-encoding-type",    std, word)
Carlos O'Donell 7a808bc
   ), NO_POSTLOAD)
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
Index: glibc-2.22/locale/langinfo.h
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/locale/langinfo.h
Carlos O'Donell 7a808bc
+++ glibc-2.22/locale/langinfo.h
Carlos O'Donell 7a808bc
@@ -255,7 +255,6 @@ enum
Carlos O'Donell 7a808bc
   _NL_COLLATE_COLLSEQMB,
Carlos O'Donell 7a808bc
   _NL_COLLATE_COLLSEQWC,
Carlos O'Donell 7a808bc
   _NL_COLLATE_CODESET,
Carlos O'Donell 7a808bc
-  _NL_COLLATE_ENCODING_TYPE,
Carlos O'Donell 7a808bc
   _NL_NUM_LC_COLLATE,
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
   /* LC_CTYPE category: character classification.
Carlos O'Donell 7a808bc
Index: glibc-2.22/locale/localeinfo.h
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/locale/localeinfo.h
Carlos O'Donell 7a808bc
+++ glibc-2.22/locale/localeinfo.h
Carlos O'Donell 7a808bc
@@ -110,14 +110,6 @@ enum coll_sort_rule
Carlos O'Donell 7a808bc
   sort_mask
Carlos O'Donell 7a808bc
 };
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
-/* Collation encoding type.  */
Carlos O'Donell 7a808bc
-enum collation_encoding_type
Carlos O'Donell 7a808bc
-{
Carlos O'Donell 7a808bc
-  __cet_other,
Carlos O'Donell 7a808bc
-  __cet_8bit,
Carlos O'Donell 7a808bc
-  __cet_utf8
Carlos O'Donell 7a808bc
-};
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
 /* We can map the types of the entries into a few categories.  */
Carlos O'Donell 7a808bc
 enum value_type
Carlos O'Donell 7a808bc
 {
Carlos O'Donell 7a808bc
Index: glibc-2.22/locale/programs/ld-collate.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/locale/programs/ld-collate.c
Carlos O'Donell 7a808bc
+++ glibc-2.22/locale/programs/ld-collate.c
Carlos O'Donell 7a808bc
@@ -32,7 +32,6 @@
Carlos O'Donell 7a808bc
 #include "linereader.h"
Carlos O'Donell 7a808bc
 #include "locfile.h"
Carlos O'Donell 7a808bc
 #include "elem-hash.h"
Carlos O'Donell 7a808bc
-#include "../localeinfo.h"
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
 /* Uncomment the following line in the production version.  */
Carlos O'Donell 7a808bc
 /* #define NDEBUG 1 */
Carlos O'Donell 7a808bc
@@ -2131,8 +2130,6 @@ collate_output (struct localedef_t *loca
Carlos O'Donell 7a808bc
 	  /* The words have to be handled specially.  */
Carlos O'Donell 7a808bc
 	  if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB))
Carlos O'Donell 7a808bc
 	    add_locale_uint32 (&file, 0);
Carlos O'Donell 7a808bc
-	  else if (idx == _NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE))
Carlos O'Donell 7a808bc
-	    add_locale_uint32 (&file, __cet_other);
Carlos O'Donell 7a808bc
 	  else
Carlos O'Donell 7a808bc
 	    add_locale_empty (&file;;
Carlos O'Donell 7a808bc
 	}
Carlos O'Donell 7a808bc
@@ -2496,12 +2493,6 @@ collate_output (struct localedef_t *loca
Carlos O'Donell 7a808bc
   add_locale_raw_data (&file, collate->mbseqorder, 256);
Carlos O'Donell 7a808bc
   add_locale_collseq_table (&file, &collate->wcseqorder);
Carlos O'Donell 7a808bc
   add_locale_string (&file, charmap->code_set_name);
Carlos O'Donell 7a808bc
-  if (strcmp (charmap->code_set_name, "UTF-8") == 0)
Carlos O'Donell 7a808bc
-    add_locale_uint32 (&file, __cet_utf8);
Carlos O'Donell 7a808bc
-  else if (charmap->mb_cur_max == 1)
Carlos O'Donell 7a808bc
-    add_locale_uint32 (&file, __cet_8bit);
Carlos O'Donell 7a808bc
-  else
Carlos O'Donell 7a808bc
-    add_locale_uint32 (&file, __cet_other);
Carlos O'Donell 7a808bc
   write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file;;
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
   obstack_free (&weightpool, NULL);
Carlos O'Donell 7a808bc
Index: glibc-2.22/string/Makefile
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/string/Makefile
Carlos O'Donell 7a808bc
+++ glibc-2.22/string/Makefile
Carlos O'Donell 7a808bc
@@ -54,7 +54,7 @@ tests		:= tester inl-tester noinl-tester
Carlos O'Donell 7a808bc
 		   tst-strtok tst-strxfrm bug-strcoll1 tst-strfry	\
Carlos O'Donell 7a808bc
 		   bug-strtok1 $(addprefix test-,$(strop-tests))	\
Carlos O'Donell 7a808bc
 		   bug-envz1 tst-strxfrm2 tst-endian tst-svc2		\
Carlos O'Donell 7a808bc
-		   tst-strtok_r
Carlos O'Donell 7a808bc
+		   tst-strtok_r bug-strcoll2
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
 xtests = tst-strcoll-overflow
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
@@ -75,4 +75,18 @@ ifeq ($(run-built-tests),yes)
Carlos O'Donell 7a808bc
 $(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out
Carlos O'Donell 7a808bc
 	cmp $^ > $@; \
Carlos O'Donell 7a808bc
 	$(evaluate-test)
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+LOCALES := de_DE.UTF-8 en_US.ISO-8859-1 en_US.UTF-8 \
Carlos O'Donell 7a808bc
+	   tr_TR.ISO-8859-9 tr_TR.UTF-8 cs_CZ.UTF-8 \
Carlos O'Donell 7a808bc
+	   da_DK.ISO-8859-1
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+include ../gen-locales.mk
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+$(objpfx)test-strcasecmp.out: $(gen-locales)
Carlos O'Donell 7a808bc
+$(objpfx)test-strncasecmp.out: $(gen-locales)
Carlos O'Donell 7a808bc
+$(objpfx)tst-strxfrm.out: $(gen-locales)
Carlos O'Donell 7a808bc
+$(objpfx)tst-strxfrm2.out: $(gen-locales)
Carlos O'Donell 7a808bc
+# bug-strcoll2 needs cs_CZ.UTF-8 and da_DK.ISO-8859-1.
Carlos O'Donell 7a808bc
+$(objpfx)bug-strcoll2.out: $(gen-locales)
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
 endif
Carlos O'Donell 7a808bc
Index: glibc-2.22/string/bug-strcoll2.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- /dev/null
Carlos O'Donell 7a808bc
+++ glibc-2.22/string/bug-strcoll2.c
Carlos O'Donell 7a808bc
@@ -0,0 +1,92 @@
Carlos O'Donell 7a808bc
+/* Bug 18589: sort-test.sh fails at random.
Carlos O'Donell 7a808bc
+   Copyright (C) 2015 Free Software Foundation, Inc.
Carlos O'Donell 7a808bc
+   This file is part of the GNU C Library.
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+   The GNU C Library is free software; you can redistribute it and/or
Carlos O'Donell 7a808bc
+   modify it under the terms of the GNU Lesser General Public
Carlos O'Donell 7a808bc
+   License as published by the Free Software Foundation; either
Carlos O'Donell 7a808bc
+   version 2.1 of the License, or (at your option) any later version.
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+   The GNU C Library is distributed in the hope that it will be useful,
Carlos O'Donell 7a808bc
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos O'Donell 7a808bc
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Carlos O'Donell 7a808bc
+   Lesser General Public License for more details.
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+   You should have received a copy of the GNU Lesser General Public
Carlos O'Donell 7a808bc
+   License along with the GNU C Library; if not, see
Carlos O'Donell 7a808bc
+   <http://www.gnu.org/licenses/>.  */
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+#include <stdio.h>
Carlos O'Donell 7a808bc
+#include <string.h>
Carlos O'Donell 7a808bc
+#include <locale.h>
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+/* An incorrect strcoll optimization resulted in incorrect
Carlos O'Donell 7a808bc
+   results from strcoll for cs_CZ and da_DK.  */
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+int
Carlos O'Donell 7a808bc
+test_cs_CZ (void)
Carlos O'Donell 7a808bc
+{
Carlos O'Donell 7a808bc
+  const char t1[] = "config";
Carlos O'Donell 7a808bc
+  const char t2[] = "choose";
Carlos O'Donell 7a808bc
+  if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL)
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      perror ("setlocale");
Carlos O'Donell 7a808bc
+      return 1;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+  /* In Czech the digraph ch sorts after c, therefore we expect
Carlos O'Donell 7a808bc
+     config to sort before choose.  */
Carlos O'Donell 7a808bc
+  int a = strcoll (t1, t2);
Carlos O'Donell 7a808bc
+  int b = strcoll (t2, t1);
Carlos O'Donell 7a808bc
+  printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
Carlos O'Donell 7a808bc
+  printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
Carlos O'Donell 7a808bc
+  if (a < 0 && b > 0)
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      puts ("PASS: config < choose");
Carlos O'Donell 7a808bc
+      return 0;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+  else
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      puts ("FAIL: Wrong sorting in cs_CZ.UTF-8.");
Carlos O'Donell 7a808bc
+      return 1;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+}
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+int
Carlos O'Donell 7a808bc
+test_da_DK (void)
Carlos O'Donell 7a808bc
+{
Carlos O'Donell 7a808bc
+  const char t1[] = "AS";
Carlos O'Donell 7a808bc
+  const char t2[] = "AA";
Carlos O'Donell 7a808bc
+  if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL)
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      perror ("setlocale");
Carlos O'Donell 7a808bc
+      return 1;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+  /* AA should be treated as the last letter of the Danish alphabet,
Carlos O'Donell 7a808bc
+     hence sorting after AS.  */
Carlos O'Donell 7a808bc
+  int a = strcoll (t1, t2);
Carlos O'Donell 7a808bc
+  int b = strcoll (t2, t1);
Carlos O'Donell 7a808bc
+  printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
Carlos O'Donell 7a808bc
+  printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
Carlos O'Donell 7a808bc
+  if (a < 0 && b > 0)
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      puts ("PASS: AS < AA");
Carlos O'Donell 7a808bc
+      return 0;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+  else
Carlos O'Donell 7a808bc
+    {
Carlos O'Donell 7a808bc
+      puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1");
Carlos O'Donell 7a808bc
+      return 1;
Carlos O'Donell 7a808bc
+    }
Carlos O'Donell 7a808bc
+}
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+static int
Carlos O'Donell 7a808bc
+do_test (void)
Carlos O'Donell 7a808bc
+{
Carlos O'Donell 7a808bc
+  int err = 0;
Carlos O'Donell 7a808bc
+  err |= test_cs_CZ ();
Carlos O'Donell 7a808bc
+  err |= test_da_DK ();
Carlos O'Donell 7a808bc
+  return err;
Carlos O'Donell 7a808bc
+}
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
+#define TEST_FUNCTION do_test ()
Carlos O'Donell 7a808bc
+#include "../test-skeleton.c"
Carlos O'Donell 7a808bc
Index: glibc-2.22/string/strcoll_l.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/string/strcoll_l.c
Carlos O'Donell 7a808bc
+++ glibc-2.22/string/strcoll_l.c
Carlos O'Donell 7a808bc
@@ -29,7 +29,6 @@
Carlos O'Donell 7a808bc
 # define STRING_TYPE char
Carlos O'Donell 7a808bc
 # define USTRING_TYPE unsigned char
Carlos O'Donell 7a808bc
 # define STRCOLL __strcoll_l
Carlos O'Donell 7a808bc
-# define STRDIFF __strdiff
Carlos O'Donell 7a808bc
 # define STRCMP strcmp
Carlos O'Donell 7a808bc
 # define WEIGHT_H "../locale/weight.h"
Carlos O'Donell 7a808bc
 # define SUFFIX	MB
Carlos O'Donell 7a808bc
@@ -42,20 +41,6 @@
Carlos O'Donell 7a808bc
 #include "../locale/localeinfo.h"
Carlos O'Donell 7a808bc
 #include WEIGHT_H
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
-#define MASK_UTF8_7BIT  (1 << 7)
Carlos O'Donell 7a808bc
-#define MASK_UTF8_START (3 << 6)
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
-size_t
Carlos O'Donell 7a808bc
-STRDIFF (const STRING_TYPE *s, const STRING_TYPE *t)
Carlos O'Donell 7a808bc
-{
Carlos O'Donell 7a808bc
-  size_t n;
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
-  for (n = 0; *s != '\0' && *s++ == *t++; ++n)
Carlos O'Donell 7a808bc
-    continue;
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
-  return n;
Carlos O'Donell 7a808bc
-}
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
 /* Track status while looking for sequences in a string.  */
Carlos O'Donell 7a808bc
 typedef struct
Carlos O'Donell 7a808bc
 {
Carlos O'Donell 7a808bc
@@ -269,29 +254,9 @@ STRCOLL (const STRING_TYPE *s1, const ST
Carlos O'Donell 7a808bc
   const USTRING_TYPE *extra;
Carlos O'Donell 7a808bc
   const int32_t *indirect;
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
-  /* In case there is no locale specific sort order (C / POSIX).  */
Carlos O'Donell 7a808bc
   if (nrules == 0)
Carlos O'Donell 7a808bc
     return STRCMP (s1, s2);
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
-  /* Fast forward to the position of the first difference.  Needs to be
Carlos O'Donell 7a808bc
-     encoding aware as the byte-by-byte comparison can stop in the middle
Carlos O'Donell 7a808bc
-     of a char sequence for multibyte encodings like UTF-8.  */
Carlos O'Donell 7a808bc
-  uint_fast32_t encoding =
Carlos O'Donell 7a808bc
-    current->values[_NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)].word;
Carlos O'Donell 7a808bc
-  if (encoding != __cet_other)
Carlos O'Donell 7a808bc
-    {
Carlos O'Donell 7a808bc
-      size_t diff = STRDIFF (s1, s2);
Carlos O'Donell 7a808bc
-      if (diff > 0)
Carlos O'Donell 7a808bc
-	{
Carlos O'Donell 7a808bc
-	  if (encoding == __cet_utf8 && (*(s1 + diff) & MASK_UTF8_7BIT) != 0)
Carlos O'Donell 7a808bc
-	    do
Carlos O'Donell 7a808bc
-	      diff--;
Carlos O'Donell 7a808bc
-	    while (diff > 0 && (*(s1 + diff) & MASK_UTF8_START) != MASK_UTF8_START);
Carlos O'Donell 7a808bc
-	  s1 += diff;
Carlos O'Donell 7a808bc
-	  s2 += diff;
Carlos O'Donell 7a808bc
-	}
Carlos O'Donell 7a808bc
-    }
Carlos O'Donell 7a808bc
-
Carlos O'Donell 7a808bc
   /* Catch empty strings.  */
Carlos O'Donell 7a808bc
   if (__glibc_unlikely (*s1 == '\0') || __glibc_unlikely (*s2 == '\0'))
Carlos O'Donell 7a808bc
     return (*s1 != '\0') - (*s2 != '\0');
Carlos O'Donell 7a808bc
@@ -358,8 +323,7 @@ STRCOLL (const STRING_TYPE *s1, const ST
Carlos O'Donell 7a808bc
 		     byte-level comparison to ensure that we don't waste time
Carlos O'Donell 7a808bc
 		     going through multiple passes for totally equal strings
Carlos O'Donell 7a808bc
 		     before proceeding to subsequent passes.  */
Carlos O'Donell 7a808bc
-		  if (pass == 0 && encoding == __cet_other &&
Carlos O'Donell 7a808bc
-		      STRCMP (s1, s2) == 0)
Carlos O'Donell 7a808bc
+		  if (pass == 0 && STRCMP (s1, s2) == 0)
Carlos O'Donell 7a808bc
 		    return result;
Carlos O'Donell 7a808bc
 		  else
Carlos O'Donell 7a808bc
 		    break;
Carlos O'Donell 7a808bc
Index: glibc-2.22/string/tst-strxfrm2.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/string/tst-strxfrm2.c
Carlos O'Donell 7a808bc
+++ glibc-2.22/string/tst-strxfrm2.c
Carlos O'Donell 7a808bc
@@ -5,6 +5,8 @@
Carlos O'Donell 7a808bc
 static int
Carlos O'Donell 7a808bc
 do_test (void)
Carlos O'Donell 7a808bc
 {
Carlos O'Donell 7a808bc
+  static const char test_locale[] = "de_DE.UTF-8";
Carlos O'Donell 7a808bc
+
Carlos O'Donell 7a808bc
   int res = 0;
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
   char buf[20];
Carlos O'Donell 7a808bc
@@ -38,9 +40,9 @@ do_test (void)
Carlos O'Donell 7a808bc
       res = 1;
Carlos O'Donell 7a808bc
     }
Carlos O'Donell 7a808bc
 
Carlos O'Donell 7a808bc
-  if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL)
Carlos O'Donell 7a808bc
+  if (setlocale (LC_ALL, test_locale) == NULL)
Carlos O'Donell 7a808bc
     {
Carlos O'Donell 7a808bc
-      puts ("setlocale failed");
Carlos O'Donell 7a808bc
+      printf ("cannot set locale \"%s\"\n", test_locale);
Carlos O'Donell 7a808bc
       res = 1;
Carlos O'Donell 7a808bc
     }
Carlos O'Donell 7a808bc
   else
Carlos O'Donell 7a808bc
Index: glibc-2.22/wcsmbs/wcscoll_l.c
Carlos O'Donell 7a808bc
===================================================================
Carlos O'Donell 7a808bc
--- glibc-2.22.orig/wcsmbs/wcscoll_l.c
Carlos O'Donell 7a808bc
+++ glibc-2.22/wcsmbs/wcscoll_l.c
Carlos O'Donell 7a808bc
@@ -23,7 +23,6 @@
Carlos O'Donell 7a808bc
 #define STRING_TYPE wchar_t
Carlos O'Donell 7a808bc
 #define USTRING_TYPE wint_t
Carlos O'Donell 7a808bc
 #define STRCOLL __wcscoll_l
Carlos O'Donell 7a808bc
-#define STRDIFF __wcsdiff
Carlos O'Donell 7a808bc
 #define STRCMP __wcscmp
Carlos O'Donell 7a808bc
 #define WEIGHT_H "../locale/weightwc.h"
Carlos O'Donell 7a808bc
 #define SUFFIX	WC