From dcc3753b29ac04b548ec04ee2bdd0c20862e23b78ba1968306e1f4de6413ce63 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 5 Oct 2015 10:15:17 +0000 Subject: [PATCH 1/2] Accepting request 336473 from home:michel_mno:branches:Base:System - new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch related to openSUSE boo#923486 OBS-URL: https://build.opensuse.org/request/show/336473 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=417 --- ...ndition-when-eliding-a-lock-20150730.patch | 152 ++++++++++++++++++ glibc-testsuite.changes | 6 + glibc-testsuite.spec | 5 +- glibc-utils.changes | 6 + glibc-utils.spec | 5 +- glibc.changes | 6 + glibc.spec | 5 +- 7 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch diff --git a/0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch b/0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch new file mode 100644 index 0000000..07776c3 --- /dev/null +++ b/0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch @@ -0,0 +1,152 @@ +From: Tulio Magno Quites Machado Filho +Date: Thu, 30 Jul 2015 13:48:56 -0300 +Subject: [PATCH][BZ 18743] PowerPC: Fix a race condition when eliding a lock + + [PATCH][BZ 18743] PowerPC: Fix a race condition when eliding a lock + +The previous code used to evaluate the preprocessor token is_lock_free to +a variable before starting a transaction. This behavior can cause an +error if another thread got the lock (without using a transaction) +between the conversion of the token and the beginning of the transaction. + +This patch delays the evaluation of is_lock_free to inside a transaction +by moving this part of the code to the macro ELIDE_LOCK. + +2015-07-30 Tulio Magno Quites Machado Filho + + [BZ #18743] + * sysdeps/powerpc/nptl/elide.h (__elide_lock): Move most of this + code to... + (ELIDE_LOCK): ...here. + (__get_new_count): New function with part of the code from + __elide_lock that updates the value of adapt_count after a + transaction abort. + (__elided_trylock): Moved this code to... + (ELIDE_TRYLOCK): ...here. + +Signed-off-by: Tulio Magno Quites Machado Filho +Signed-off-by: Michel Normand +Index: glibc-2.22/sysdeps/powerpc/nptl/elide.h +=================================================================== +--- glibc-2.22.orig/sysdeps/powerpc/nptl/elide.h ++++ glibc-2.22/sysdeps/powerpc/nptl/elide.h +@@ -23,67 +23,67 @@ + # include + # include + +-/* Returns true if the lock defined by is_lock_free as elided. +- ADAPT_COUNT is a pointer to per-lock state variable. */ +- ++/* Get the new value of adapt_count according to the elision ++ configurations. Returns true if the system should retry again or false ++ otherwise. */ + static inline bool +-__elide_lock (uint8_t *adapt_count, int is_lock_free) ++__get_new_count (uint8_t *adapt_count) + { +- if (*adapt_count > 0) ++ /* A persistent failure indicates that a retry will probably ++ result in another failure. Use normal locking now and ++ for the next couple of calls. */ ++ if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) + { +- (*adapt_count)--; ++ if (__elision_aconf.skip_lock_internal_abort > 0) ++ *adapt_count = __elision_aconf.skip_lock_internal_abort; + return false; + } +- +- for (int i = __elision_aconf.try_tbegin; i > 0; i--) +- { +- if (__builtin_tbegin (0)) +- { +- if (is_lock_free) +- return true; +- /* Lock was busy. */ +- __builtin_tabort (_ABORT_LOCK_BUSY); +- } +- else +- { +- /* A persistent failure indicates that a retry will probably +- result in another failure. Use normal locking now and +- for the next couple of calls. */ +- if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) +- { +- if (__elision_aconf.skip_lock_internal_abort > 0) +- *adapt_count = __elision_aconf.skip_lock_internal_abort; +- break; +- } +- /* Same logic as above, but for a number of temporary failures in a +- a row. */ +- else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0 +- && __elision_aconf.try_tbegin > 0) +- *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries; +- } +- } +- +- return false; ++ /* Same logic as above, but for a number of temporary failures in a ++ a row. */ ++ else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0 ++ && __elision_aconf.try_tbegin > 0) ++ *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries; ++ return true; + } + +-# define ELIDE_LOCK(adapt_count, is_lock_free) \ +- __elide_lock (&(adapt_count), is_lock_free) +- +- +-static inline bool +-__elide_trylock (uint8_t *adapt_count, int is_lock_free, int write) +-{ +- if (__elision_aconf.try_tbegin > 0) +- { +- if (write) +- __builtin_tabort (_ABORT_NESTED_TRYLOCK); +- return __elide_lock (adapt_count, is_lock_free); +- } +- return false; +-} ++/* Returns 0 if the lock defined by is_lock_free was elided. ++ ADAPT_COUNT is a per-lock state variable. */ ++# define ELIDE_LOCK(adapt_count, is_lock_free) \ ++ ({ \ ++ int ret = 0; \ ++ if (adapt_count > 0) \ ++ (adapt_count)--; \ ++ else \ ++ for (int i = __elision_aconf.try_tbegin; i > 0; i--) \ ++ { \ ++ asm volatile("" ::: "memory"); \ ++ if (__builtin_tbegin (0)) \ ++ { \ ++ if (is_lock_free) \ ++ { \ ++ ret = 1; \ ++ break; \ ++ } \ ++ __builtin_tabort (_ABORT_LOCK_BUSY); \ ++ } \ ++ else \ ++ if (!__get_new_count(&adapt_count)) \ ++ break; \ ++ } \ ++ ret; \ ++ }) + + # define ELIDE_TRYLOCK(adapt_count, is_lock_free, write) \ +- __elide_trylock (&(adapt_count), is_lock_free, write) ++ ({ \ ++ int ret = 0; \ ++ if (__elision_aconf.try_tbegin > 0) \ ++ { \ ++ if (write) \ ++ __builtin_tabort (_ABORT_NESTED_TRYLOCK); \ ++ ret = ELIDE_LOCK (adapt_count, is_lock_free); \ ++ } \ ++ ret; \ ++ }) + + + static inline bool diff --git a/glibc-testsuite.changes b/glibc-testsuite.changes index df4e7ef..1293151 100644 --- a/glibc-testsuite.changes +++ b/glibc-testsuite.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com + +- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock + 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch + ------------------------------------------------------------------- Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de diff --git a/glibc-testsuite.spec b/glibc-testsuite.spec index 022d1cf..9992adc 100644 --- a/glibc-testsuite.spec +++ b/glibc-testsuite.spec @@ -1,7 +1,7 @@ # # spec file for package glibc-testsuite # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -258,6 +258,8 @@ 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 +Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -470,6 +472,7 @@ rm nscd/s-stamp %patch2007 -p1 %patch2008 -p1 %patch2009 -p1 +%patch2010 -p1 %patch3000 diff --git a/glibc-utils.changes b/glibc-utils.changes index df4e7ef..1293151 100644 --- a/glibc-utils.changes +++ b/glibc-utils.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com + +- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock + 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch + ------------------------------------------------------------------- Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de diff --git a/glibc-utils.spec b/glibc-utils.spec index e17d5fe..77800be 100644 --- a/glibc-utils.spec +++ b/glibc-utils.spec @@ -1,7 +1,7 @@ # # spec file for package glibc-utils # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -257,6 +257,8 @@ 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 +Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -470,6 +472,7 @@ rm nscd/s-stamp %patch2007 -p1 %patch2008 -p1 %patch2009 -p1 +%patch2010 -p1 %patch3000 diff --git a/glibc.changes b/glibc.changes index df4e7ef..1293151 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com + +- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock + 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch + ------------------------------------------------------------------- Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de diff --git a/glibc.spec b/glibc.spec index ae68e2a..ea3bc6c 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,7 +1,7 @@ # # spec file for package glibc # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -258,6 +258,8 @@ 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 +Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -470,6 +472,7 @@ rm nscd/s-stamp %patch2007 -p1 %patch2008 -p1 %patch2009 -p1 +%patch2010 -p1 %patch3000 From 5366b2a10b3c185d673822ada6d59fe716583b79e9294fa3883f5dea72b728dc Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 12 Oct 2015 12:31:32 +0000 Subject: [PATCH 2/2] Accepting request 338135 from home:Andreas_Schwab:Factory - strcoll-remove-strdiff-opt.patch: Remove incorrect STRDIFF-based optimization (BZ #18589) - iconv-reset-input-buffer.patch: Fix iconv buffer handling with IGNORE error handler (BZ #18830) OBS-URL: https://build.opensuse.org/request/show/338135 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=418 --- glibc-testsuite.changes | 12 + glibc-testsuite.spec | 10 +- glibc-utils.changes | 12 + glibc-utils.spec | 10 +- glibc.changes | 12 + glibc.spec | 10 +- iconv-reset-input-buffer.patch | 298 +++++++++++++++++++++++++ strcoll-remove-strdiff-opt.patch | 366 +++++++++++++++++++++++++++++++ 8 files changed, 724 insertions(+), 6 deletions(-) create mode 100644 iconv-reset-input-buffer.patch create mode 100644 strcoll-remove-strdiff-opt.patch 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