[packages/glibc] - fix https://sourceware.org/bugzilla/show_bug.cgi?id=22298 a.k.a. broken locking on x32 - rel 5
baggins
baggins at pld-linux.org
Mon Oct 16 21:21:28 CEST 2017
commit 3955fda507ddf728a7901f4dde30bb3f21ecaffc
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Mon Oct 16 21:20:49 2017 +0200
- fix https://sourceware.org/bugzilla/show_bug.cgi?id=22298 a.k.a. broken locking on x32
- rel 5
bz22298.patch | 246 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
glibc.spec | 4 +-
2 files changed, 249 insertions(+), 1 deletion(-)
---
diff --git a/glibc.spec b/glibc.spec
index ecd264f..89b080e 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -41,7 +41,7 @@ Summary(tr.UTF-8): GNU libc
Summary(uk.UTF-8): GNU libc версії
Name: glibc
Version: %{core_version}
-Release: 4
+Release: 5
Epoch: 6
License: LGPL v2.1+
Group: Libraries
@@ -88,6 +88,7 @@ Patch27: %{name}-c-utf8-locale.patch
Patch29: %{name}-arm-alignment-fix.patch
Patch30: glibc-rh1124987.patch
+Patch31: bz22298.patch
URL: http://www.gnu.org/software/libc/
%{?with_selinux:BuildRequires: audit-libs-devel}
BuildRequires: autoconf >= 2.69
@@ -978,6 +979,7 @@ exit 1
%patch29 -p1
%patch30 -p1
+%patch31 -p1
# cleanup backups after patching
find '(' -name '*~' -o -name '*.orig' ')' -print0 | xargs -0 -r -l512 rm -f
diff --git a/bz22298.patch b/bz22298.patch
new file mode 100644
index 0000000..8444d16
--- /dev/null
+++ b/bz22298.patch
@@ -0,0 +1,246 @@
+From 16be5568a0c24b9bd1ade7fa937c94b5d53b6ab1 Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools at gmail.com>
+Date: Sun, 15 Oct 2017 07:48:58 -0700
+Subject: [PATCH] Define __PTHREAD_MUTEX_HAVE_PREV only if undefined [BZ
+ #22298]
+
+It is incorrect to define __PTHREAD_MUTEX_HAVE_PREV to 1 only when
+__WORDSIZE == 64. For x32, __PTHREAD_MUTEX_HAVE_PREV should be 1, but
+it has __WORDSIZE == 32. This patch defines __PTHREAD_MUTEX_HAVE_PREV
+based on __WORDSIZE only if it is undefined. __PTHREAD_MUTEX_HAVE_PREV
+check is changed from "#ifdef" to "#if" to support values of 0 or 1.
+
+ [BZ #22298]
+ * nptl/allocatestack.c (allocate_stack): Check if
+ __PTHREAD_MUTEX_HAVE_PREV is non-zero, instead if
+ __PTHREAD_MUTEX_HAVE_PREV is defined.
+ * nptl/descr.h (pthread): Likewise.
+ * nptl/nptl-init.c (__pthread_initialize_minimal_internal):
+ Likewise.
+ * nptl/pthread_create.c (START_THREAD_DEFN): Likewise.
+ * sysdeps/nptl/fork.c (__libc_fork): Likewise.
+ * sysdeps/nptl/pthread.h (PTHREAD_MUTEX_INITIALIZER): Likewise.
+ * sysdeps/nptl/bits/thread-shared-types.h
+ (__PTHREAD_MUTEX_HAVE_PREV): Define only if it is undefined.
+ (__pthread_internal_list): Check __pthread_internal_list instead
+ of __WORDSIZE.
+ (__PTHREAD_SPINS_DATA): Likewise.
+ (__PTHREAD_SPINS): Likewise.
+ (__pthread_mutex_s): Likewise.
+ * sysdeps/x86/nptl/bits/pthreadtypes-arch.h
+ (__PTHREAD_MUTEX_HAVE_PREV): Defined.
+---
+ nptl/allocatestack.c | 2 +-
+ nptl/descr.h | 2 +-
+ nptl/nptl-init.c | 2 +-
+ nptl/pthread_create.c | 4 ++--
+ sysdeps/nptl/bits/thread-shared-types.h | 17 ++++++++++++-----
+ sysdeps/nptl/fork.c | 2 +-
+ sysdeps/nptl/pthread.h | 2 +-
+ sysdeps/x86/nptl/bits/pthreadtypes-arch.h | 2 ++
+ 8 files changed, 21 insertions(+), 12 deletions(-)
+
+diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
+index ad9add8..1cc7893 100644
+--- a/nptl/allocatestack.c
++++ b/nptl/allocatestack.c
+@@ -753,7 +753,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
+ - offsetof (pthread_mutex_t,
+ __data.__list.__next));
+ pd->robust_head.list_op_pending = NULL;
+-#ifdef __PTHREAD_MUTEX_HAVE_PREV
++#if __PTHREAD_MUTEX_HAVE_PREV
+ pd->robust_prev = &pd->robust_head;
+ #endif
+ pd->robust_head.list = &pd->robust_head;
+diff --git a/nptl/descr.h b/nptl/descr.h
+index c5ad0c8..c83b17b 100644
+--- a/nptl/descr.h
++++ b/nptl/descr.h
+@@ -169,7 +169,7 @@ struct pthread
+ pid_t pid_ununsed;
+
+ /* List of robust mutexes the thread is holding. */
+-#ifdef __PTHREAD_MUTEX_HAVE_PREV
++#if __PTHREAD_MUTEX_HAVE_PREV
+ void *robust_prev;
+ struct robust_list_head robust_head;
+
+diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
+index 2921607..869e926 100644
+--- a/nptl/nptl-init.c
++++ b/nptl/nptl-init.c
+@@ -297,7 +297,7 @@ __pthread_initialize_minimal_internal (void)
+
+ /* Initialize the robust mutex data. */
+ {
+-#ifdef __PTHREAD_MUTEX_HAVE_PREV
++#if __PTHREAD_MUTEX_HAVE_PREV
+ pd->robust_prev = &pd->robust_head;
+ #endif
+ pd->robust_head.list = &pd->robust_head;
+diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
+index 992331e..51ae60d 100644
+--- a/nptl/pthread_create.c
++++ b/nptl/pthread_create.c
+@@ -518,7 +518,7 @@ START_THREAD_DEFN
+
+ #ifndef __ASSUME_SET_ROBUST_LIST
+ /* If this thread has any robust mutexes locked, handle them now. */
+-# ifdef __PTHREAD_MUTEX_HAVE_PREV
++# if __PTHREAD_MUTEX_HAVE_PREV
+ void *robust = pd->robust_head.list;
+ # else
+ __pthread_slist_t *robust = pd->robust_list.__next;
+@@ -536,7 +536,7 @@ START_THREAD_DEFN
+ __list.__next));
+ robust = *((void **) robust);
+
+-# ifdef __PTHREAD_MUTEX_HAVE_PREV
++# if __PTHREAD_MUTEX_HAVE_PREV
+ this->__list.__prev = NULL;
+ # endif
+ this->__list.__next = NULL;
+diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h
+index 68b82b6..d2c4f67 100644
+--- a/sysdeps/nptl/bits/thread-shared-types.h
++++ b/sysdeps/nptl/bits/thread-shared-types.h
+@@ -59,7 +59,15 @@
+
+ /* Common definition of pthread_mutex_t. */
+
+-#if __WORDSIZE == 64
++#ifndef __PTHREAD_MUTEX_HAVE_PREV
++# if __WORDSIZE == 64
++# define __PTHREAD_MUTEX_HAVE_PREV 1
++# else
++# define __PTHREAD_MUTEX_HAVE_PREV 0
++# endif
++#endif
++
++#if __PTHREAD_MUTEX_HAVE_PREV
+ typedef struct __pthread_internal_list
+ {
+ struct __pthread_internal_list *__prev;
+@@ -74,7 +82,7 @@ typedef struct __pthread_internal_slist
+
+ /* Lock elision support. */
+ #if __PTHREAD_MUTEX_LOCK_ELISION
+-# if __WORDSIZE == 64
++# if __PTHREAD_MUTEX_HAVE_PREV
+ # define __PTHREAD_SPINS_DATA \
+ short __spins; \
+ short __elision
+@@ -101,17 +109,16 @@ struct __pthread_mutex_s
+ int __lock __LOCK_ALIGNMENT;
+ unsigned int __count;
+ int __owner;
+-#if __WORDSIZE == 64
++#if __PTHREAD_MUTEX_HAVE_PREV
+ unsigned int __nusers;
+ #endif
+ /* KIND must stay at this position in the structure to maintain
+ binary compatibility with static initializers. */
+ int __kind;
+ __PTHREAD_COMPAT_PADDING_MID
+-#if __WORDSIZE == 64
++#if __PTHREAD_MUTEX_HAVE_PREV
+ __PTHREAD_SPINS_DATA;
+ __pthread_list_t __list;
+-# define __PTHREAD_MUTEX_HAVE_PREV 1
+ #else
+ unsigned int __nusers;
+ __extension__ union
+diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c
+index 4bb87e2..48676c2 100644
+--- a/sysdeps/nptl/fork.c
++++ b/sysdeps/nptl/fork.c
+@@ -166,7 +166,7 @@ __libc_fork (void)
+ inherit the correct value from the parent. We do not need to clear
+ the pending operation because it must have been zero when fork was
+ called. */
+-# ifdef __PTHREAD_MUTEX_HAVE_PREV
++# if __PTHREAD_MUTEX_HAVE_PREV
+ self->robust_prev = &self->robust_head;
+ # endif
+ self->robust_head.list = &self->robust_head;
+diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
+index 632ea7b..2b2b386 100644
+--- a/sysdeps/nptl/pthread.h
++++ b/sysdeps/nptl/pthread.h
+@@ -83,7 +83,7 @@ enum
+ #endif
+
+
+-#ifdef __PTHREAD_MUTEX_HAVE_PREV
++#if __PTHREAD_MUTEX_HAVE_PREV
+ # define PTHREAD_MUTEX_INITIALIZER \
+ { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }
+ # ifdef __USE_GNU
+diff --git a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
+index fd86806..2446d8d 100644
+--- a/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
++++ b/sysdeps/x86/nptl/bits/pthreadtypes-arch.h
+@@ -21,6 +21,7 @@
+ #include <bits/wordsize.h>
+
+ #ifdef __x86_64__
++# define __PTHREAD_MUTEX_HAVE_PREV 1
+ # if __WORDSIZE == 64
+ # define __SIZEOF_PTHREAD_MUTEX_T 40
+ # define __SIZEOF_PTHREAD_ATTR_T 56
+@@ -35,6 +36,7 @@
+ # define __SIZEOF_PTHREAD_BARRIER_T 20
+ # endif
+ #else
++# define __PTHREAD_MUTEX_HAVE_PREV 0
+ # define __SIZEOF_PTHREAD_MUTEX_T 24
+ # define __SIZEOF_PTHREAD_ATTR_T 36
+ # define __SIZEOF_PTHREAD_MUTEX_T 24
+--
+2.9.3
+
+From df44f9d02b68de45ba8c3984f47ecf1a523306ec Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools at gmail.com>
+Date: Sun, 15 Oct 2017 07:23:41 -0700
+Subject: [PATCH] x32: Verify that NPTL structures are correct [BZ #22298]
+
+Add a build-time check to verify that NPTL structures are correct.
+
+ * sysdeps/x86_64/x32/nptl/Makefile: New file.
+ * sysdeps/x86_64/x32/nptl/nptl-check.sym: Likewise.
+---
+ sysdeps/x86_64/x32/nptl/Makefile | 4 ++++
+ sysdeps/x86_64/x32/nptl/nptl-check.sym | 9 +++++++++
+ 2 files changed, 13 insertions(+)
+ create mode 100644 sysdeps/x86_64/x32/nptl/Makefile
+ create mode 100644 sysdeps/x86_64/x32/nptl/nptl-check.sym
+
+diff --git a/sysdeps/x86_64/x32/nptl/Makefile b/sysdeps/x86_64/x32/nptl/Makefile
+new file mode 100644
+index 0000000..e780bea
+--- /dev/null
++++ b/sysdeps/x86_64/x32/nptl/Makefile
+@@ -0,0 +1,4 @@
++ifeq ($(subdir),csu)
++# Verify that NPTL structures are correct.
++gen-as-const-headers += nptl-check.sym
++endif
+diff --git a/sysdeps/x86_64/x32/nptl/nptl-check.sym b/sysdeps/x86_64/x32/nptl/nptl-check.sym
+new file mode 100644
+index 0000000..8573250
+--- /dev/null
++++ b/sysdeps/x86_64/x32/nptl/nptl-check.sym
+@@ -0,0 +1,9 @@
++#include <sysdep.h>
++#include <pthread.h>
++
++PREV offsetof (struct __pthread_internal_list, __prev)
++NEXT offsetof (struct __pthread_internal_list, __next)
++
++#if __PTHREAD_MUTEX_HAVE_PREV != 1
++#error __PTHREAD_MUTEX_HAVE_PREV must be 1
++#endif
+--
+2.9.3
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/glibc.git/commitdiff/3955fda507ddf728a7901f4dde30bb3f21ecaffc
More information about the pld-cvs-commit
mailing list