]> git.ipfire.org Git - thirdparty/glibc.git/commit - NEWS
Fix blocking pthread_join. [BZ #23137]
authorStefan Liebler <stli@linux.vnet.ibm.com>
Thu, 17 May 2018 12:05:51 +0000 (14:05 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 17 May 2018 12:05:51 +0000 (14:05 +0200)
commitbe056fae3bc1fe1019761a4b4994e808344b05e1
treeb541b5245179ca5d1db595246663a89f6a6e2fb4
parent02f0dd83a4abf190f13eef8d70811a7c8ec896ad
Fix blocking pthread_join. [BZ #23137]

On s390 (31bit) if glibc is build with -Os, pthread_join sometimes
blocks indefinitely. This is e.g. observable with
testcase intl/tst-gettext6.

pthread_join is calling lll_wait_tid(tid), which performs the futex-wait
syscall in a loop as long as tid != 0 (thread is alive).

On s390 (and build with -Os), tid is loaded from memory before
comparing against zero and then the tid is loaded a second time
in order to pass it to the futex-wait-syscall.
If the thread exits in between, then the futex-wait-syscall is
called with the value zero and it waits until a futex-wake occurs.
As the thread is already exited, there won't be a futex-wake.

In lll_wait_tid, the tid is stored to the local variable __tid,
which is then used as argument for the futex-wait-syscall.
But unfortunately the compiler is allowed to reload the value
from memory.

With this patch, the tid is loaded with atomic_load_acquire.
Then the compiler is not allowed to reload the value for __tid from memory.

ChangeLog:

[BZ #23137]
* sysdeps/nptl/lowlevellock.h (lll_wait_tid):
Use atomic_load_acquire to load __tid.

(cherry picked from commit 1660901840dfc9fde6c5720a32f901af6f08f00a)
ChangeLog
NEWS
sysdeps/nptl/lowlevellock.h