diff --git a/glibc.changes b/glibc.changes index c2245af..fc51d51 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Jun 8 13:32:57 UTC 2022 - Andreas Schwab + +- strncpy-power9-vsx.patch: powerpc: Fix VSX register number on + __strncpy_power9 (BZ #29197) +- nptl-cleanup-async-restore.patch: nptl: Fix __libc_cleanup_pop_restore + asynchronous restore (bsc#1200093, BZ #29214) + ------------------------------------------------------------------- Tue May 17 14:07:46 UTC 2022 - Andreas Schwab diff --git a/glibc.spec b/glibc.spec index 6456331..662d12f 100644 --- a/glibc.spec +++ b/glibc.spec @@ -295,6 +295,10 @@ Patch1003: pt-load-invalid-hole.patch Patch1004: localedef-ld-monetary.patch # PATCH-FIX-UPSTREAM nptl: Handle spurious EINTR when thread cancellation is disabled (BZ #29029) Patch1005: nptl-spurious-eintr.patch +# PATCH-FIX-UPSTREAM powerpc: Fix VSX register number on __strncpy_power9 (BZ #29197) +Patch1006: strncpy-power9-vsx.patch +# PATCH-FIX-UPSTREAM nptl: Fix __libc_cleanup_pop_restore asynchronous restore (BZ #29214) +Patch1007: nptl-cleanup-async-restore.patch ### # Patches awaiting upstream approval @@ -520,6 +524,8 @@ library in a cross compilation setting. %patch1003 -p1 %patch1004 -p1 %patch1005 -p1 +%patch1006 -p1 +%patch1007 -p1 %patch2000 -p1 %patch2001 -p1 diff --git a/nptl-cleanup-async-restore.patch b/nptl-cleanup-async-restore.patch new file mode 100644 index 0000000..1ba124a --- /dev/null +++ b/nptl-cleanup-async-restore.patch @@ -0,0 +1,136 @@ +From 97dd8b3f705b23de1f84713082b631189084a33b Mon Sep 17 00:00:00 2001 +From: Adhemerval Zanella +Date: Tue, 31 May 2022 17:13:35 -0300 +Subject: [PATCH] nptl: Fix __libc_cleanup_pop_restore asynchronous restore + (BZ#29214) + +This was due a wrong revert done on 404656009b459658. + +Checked on x86_64-linux-gnu. + +(cherry picked from commit c7d36dcecc08a29825175f65c4ee873ff3177a23) +--- + NEWS | 1 + + nptl/libc-cleanup.c | 3 +- + sysdeps/pthread/Makefile | 1 + + sysdeps/pthread/tst-cancel30.c | 82 ++++++++++++++++++++++++++++++++++ + 4 files changed, 86 insertions(+), 1 deletion(-) + create mode 100644 sysdeps/pthread/tst-cancel30.c + +diff --git a/nptl/libc-cleanup.c b/nptl/libc-cleanup.c +index c4a83591bf..2ce59388d4 100644 +--- a/nptl/libc-cleanup.c ++++ b/nptl/libc-cleanup.c +@@ -57,7 +57,8 @@ __libc_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer) + THREAD_SETMEM (self, cleanup, buffer->__prev); + + int cancelhandling = atomic_load_relaxed (&self->cancelhandling); +- if (cancelhandling & CANCELTYPE_BITMASK) ++ if (buffer->__canceltype != PTHREAD_CANCEL_DEFERRED ++ && (cancelhandling & CANCELTYPE_BITMASK) == 0) + { + int newval; + do +diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile +index c725586308..3a505c5f99 100644 +--- a/sysdeps/pthread/Makefile ++++ b/sysdeps/pthread/Makefile +@@ -126,6 +126,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ + tst-pthread-raise-blocked-self \ + tst-pthread_kill-exited \ + tst-pthread_kill-exiting \ ++ tst-cancel30 \ + # tests + + tests-time64 := \ +diff --git a/sysdeps/pthread/tst-cancel30.c b/sysdeps/pthread/tst-cancel30.c +new file mode 100644 +index 0000000000..e08392f968 +--- /dev/null ++++ b/sysdeps/pthread/tst-cancel30.c +@@ -0,0 +1,82 @@ ++/* Check if printf like functions does not disable asynchronous cancellation ++ mode (BZ#29214). ++ ++ Copyright (C) 2022 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 ++#include ++#include ++ ++static pthread_barrier_t b; ++ ++static void * ++tf (void *arg) ++{ ++ int old; ++ ++ TEST_COMPARE (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL), 0); ++ ++ TEST_COMPARE (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old), 0); ++ TEST_COMPARE (old, PTHREAD_CANCEL_ASYNCHRONOUS); ++ ++ /* Check if internal lock cleanup routines restore the cancellation type ++ correctly. */ ++ printf ("...\n"); ++ TEST_COMPARE (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &old), 0); ++ TEST_COMPARE (old, PTHREAD_CANCEL_ASYNCHRONOUS); ++ ++ xpthread_barrier_wait (&b); ++ ++ /* Wait indefinitely for cancellation, which only works if asynchronous ++ cancellation is enabled. */ ++#ifdef SYS_pause ++ syscall (SYS_pause); ++#elif defined SYS_ppoll || defined SYS_ppoll_time64 ++# ifndef SYS_ppoll_time64 ++# define SYS_ppoll_time64 SYS_ppoll ++# endif ++ syscall (SYS_ppoll_time64, NULL, 0, NULL, NULL); ++#else ++ for (;;); ++#endif ++ ++ return 0; ++} ++ ++static int ++do_test (void) ++{ ++ xpthread_barrier_init (&b, NULL, 2); ++ ++ pthread_t th = xpthread_create (NULL, tf, NULL); ++ ++ xpthread_barrier_wait (&b); ++ ++ xpthread_cancel (th); ++ ++ void *status = xpthread_join (th); ++ TEST_VERIFY (status == PTHREAD_CANCELED); ++ ++ return 0; ++} ++ ++/* There is no need to wait full TIMEOUT if asynchronous is not working. */ ++#define TIMEOUT 3 ++#include +-- +2.35.3 + diff --git a/strncpy-power9-vsx.patch b/strncpy-power9-vsx.patch new file mode 100644 index 0000000..d52faa3 --- /dev/null +++ b/strncpy-power9-vsx.patch @@ -0,0 +1,48 @@ +From 0a1572b8bb880a63d50a63b2afe4bb67704ac23e Mon Sep 17 00:00:00 2001 +From: Matheus Castanho +Date: Tue, 7 Jun 2022 10:27:26 -0300 +Subject: [PATCH] powerpc: Fix VSX register number on __strncpy_power9 [BZ + #29197] + +__strncpy_power9 initializes VR 18 with zeroes to be used throughout the +code, including when zero-padding the destination string. However, the +v18 reference was mistakenly being used for stxv and stxvl, which take a +VSX vector as operand. The code ended up using the uninitialized VSR 18 +register by mistake. + +Both occurrences have been changed to use the proper VSX number for VR 18 +(i.e. VSR 50). + +Tested on powerpc, powerpc64 and powerpc64le. + +Signed-off-by: Kewen Lin +(cherry picked from commit 0218463dd8265ed937622f88ac68c7d984fe0cfc) +--- + sysdeps/powerpc/powerpc64/le/power9/strncpy.S | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sysdeps/powerpc/powerpc64/le/power9/strncpy.S b/sysdeps/powerpc/powerpc64/le/power9/strncpy.S +index ae23161316..deb94671cc 100644 +--- a/sysdeps/powerpc/powerpc64/le/power9/strncpy.S ++++ b/sysdeps/powerpc/powerpc64/le/power9/strncpy.S +@@ -352,7 +352,7 @@ L(zero_padding_loop): + cmpldi cr6,r5,16 /* Check if length was reached. */ + ble cr6,L(zero_padding_end) + +- stxv v18,0(r11) ++ stxv 32+v18,0(r11) + addi r11,r11,16 + addi r5,r5,-16 + +@@ -360,7 +360,7 @@ L(zero_padding_loop): + + L(zero_padding_end): + sldi r10,r5,56 /* stxvl wants size in top 8 bits */ +- stxvl v18,r11,r10 /* Partial store */ ++ stxvl 32+v18,r11,r10 /* Partial store */ + blr + + .align 4 +-- +2.35.3 +