From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25274 invoked by alias); 19 Feb 2019 07:37:29 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 25251 invoked by uid 89); 19 Feb 2019 07:37:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY autolearn=ham version=3.3.2 spammy=stuck, codes, alarm X-Spam-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: hall.aurel32.net Received: from hall.aurel32.net (HELO hall.aurel32.net) (163.172.24.10) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 19 Feb 2019 07:37:26 +0000 Received: from 2a01cb068021b6efba52e1afd35b9a91.ipv6.abo.wanadoo.fr ([2a01:cb06:8021:b6ef:ba52:e1af:d35b:9a91] helo=ohm.local) by hall.aurel32.net with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gvzy0-00058f-99; Tue, 19 Feb 2019 08:37:24 +0100 Received: from aurel32 by ohm.local with local (Exim 4.92-RC5) (envelope-from ) id 1gvzxs-0005fP-Rj; Tue, 19 Feb 2019 08:37:16 +0100 From: Aurelien Jarno To: libc-stable@sourceware.org Cc: Jim Wilson Subject: [2.28 COMMITTED] RISC-V: Fix elfutils testsuite unwind failures. Date: Tue, 01 Jan 2019 00:00:00 -0000 Message-Id: <20190219073706.21726-1-aurelien@aurel32.net> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2019-02/txt/msg00024.txt.bz2 From: Jim Wilson The clone.S patch fixes 2 elfutils testsuite unwind failures, where the backtrace gets stuck repeating __thread_start until we hit the backtrace limit. This was confirmed by building and installing a patched glibc and then building elfutils and running its testsuite. Unfortunately, the testcase isn't working as expected and I don't know why. The testcase passes even when my clone.S patch is not installed. The testcase looks logically similarly to the elfutils testcases that are failing. Maybe there is a subtle difference in how the glibc unwinding works versus the elfutils unwinding? I don't have good gdb pthread support yet, so I haven't found a way to debug this. Anyways, I don't know if the testcase is useful or not. If the testcase isn't useful then maybe the clone.S patch is OK without a testcase? Jim [BZ #24040] * elf/Makefile (CFLAGS-tst-unwind-main.c): Add -DUSE_PTHREADS=0. * elf/tst-unwind-main.c: If USE_PTHEADS, include pthread.h and error.h (func): New. (main): If USE_PTHREADS, call pthread_create to run func. Otherwise call func directly. * nptl/Makefile (tests): Add tst-unwind-thread. (CFLAGS-tst-unwind-thread.c): Define. * nptl/tst-unwind-thread.c: New file. * sysdeps/unix/sysv/linux/riscv/clone.S (__thread_start): Mark ra as undefined. (cherry picked from commit 85bd1ddbdfdfd13cfd06f7c367519b6ed3360843) --- ChangeLog | 14 ++++++++++++++ NEWS | 1 + elf/Makefile | 2 +- elf/tst-unwind-main.c | 28 ++++++++++++++++++++++++--- nptl/Makefile | 5 ++++- nptl/tst-unwind-thread.c | 2 ++ sysdeps/unix/sysv/linux/riscv/clone.S | 5 +++++ 7 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 nptl/tst-unwind-thread.c diff --git a/ChangeLog b/ChangeLog index 06de839fbe..0087fd9d50 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2019-01-13 Jim Wilson + + [BZ #24040] + * elf/Makefile (CFLAGS-tst-unwind-main.c): Add -DUSE_PTHREADS=0. + * elf/tst-unwind-main.c: If USE_PTHEADS, include pthread.h and error.h + (func): New. + (main): If USE_PTHREADS, call pthread_create to run func. Otherwise + call func directly. + * nptl/Makefile (tests): Add tst-unwind-thread. + (CFLAGS-tst-unwind-thread.c): Define. + * nptl/tst-unwind-thread.c: New file. + * sysdeps/unix/sysv/linux/riscv/clone.S (__thread_start): Mark ra + as undefined. + 2019-01-31 Carlos O'Donell Torvald Riegel Rik Prohaska diff --git a/NEWS b/NEWS index d794e5bf09..2d5a514dfd 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,7 @@ The following bugs are resolved with this release: [24024] strerror() might set errno to ENOMEM due to -fno-math-error [24027] malloc: Integer overflow in realloc [24034] tst-cancel21-static fails with SIGBUS on pre-ARMv7 when using GCC 8 + [24040] riscv64: unterminated call chain in __thread_start [24097] Can't use 64-bit register for size_t in assembly codes for x32 (CVE-2019-6488) [24155] x32 memcmp can treat positive length as 0 (if sign bit in RDX is set) (CVE-2019-7309) [24161] __run_fork_handlers self-deadlocks in malloc/tst-mallocfork2 diff --git a/elf/Makefile b/elf/Makefile index 43f625af05..6027926bd1 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1486,4 +1486,4 @@ $(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so $(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so -CFLAGS-tst-unwind-main.c += -funwind-tables +CFLAGS-tst-unwind-main.c += -funwind-tables -DUSE_PTHREADS=0 diff --git a/elf/tst-unwind-main.c b/elf/tst-unwind-main.c index d1236032d7..7c20f04743 100644 --- a/elf/tst-unwind-main.c +++ b/elf/tst-unwind-main.c @@ -20,19 +20,41 @@ #include #include +#if USE_PTHREADS +# include +# include +#endif + static _Unwind_Reason_Code callback (struct _Unwind_Context *ctx, void *arg) { return _URC_NO_REASON; } -int -main (void) +static void * +func (void *a) { /* Arrange for this test to be killed if _Unwind_Backtrace runs into an endless loop. We cannot use the test driver because the complete call chain needs to be compiled with -funwind-tables so that - _Unwind_Backtrace is able to reach _start. */ + _Unwind_Backtrace is able to reach the start routine. */ alarm (DEFAULT_TIMEOUT); _Unwind_Backtrace (callback, 0); + return a; +} + +int +main (void) +{ +#if USE_PTHREADS + pthread_t thr; + int rc = pthread_create (&thr, NULL, &func, NULL); + if (rc) + error (1, rc, "pthread_create"); + rc = pthread_join (thr, NULL); + if (rc) + error (1, rc, "pthread_join"); +#else + func (NULL); +#endif } diff --git a/nptl/Makefile b/nptl/Makefile index b1003cf56b..5be7655529 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -320,7 +320,8 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \ tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \ tst-mtx-recursive tst-tss-basic tst-call-once tst-mtx-timedlock \ tst-rwlock-pwn \ - tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall + tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall \ + tst-unwind-thread tests-internal := tst-rwlock19 tst-rwlock20 \ tst-sem11 tst-sem12 tst-sem13 \ @@ -723,6 +724,8 @@ $(objpfx)tst-audit-threads: $(objpfx)tst-audit-threads-mod2.so $(objpfx)tst-audit-threads.out: $(objpfx)tst-audit-threads-mod1.so tst-audit-threads-ENV = LD_AUDIT=$(objpfx)tst-audit-threads-mod1.so +CFLAGS-tst-unwind-thread.c += -funwind-tables + # The tests here better do not run in parallel ifneq ($(filter %tests,$(MAKECMDGOALS)),) .NOTPARALLEL: diff --git a/nptl/tst-unwind-thread.c b/nptl/tst-unwind-thread.c new file mode 100644 index 0000000000..d5c38e3709 --- /dev/null +++ b/nptl/tst-unwind-thread.c @@ -0,0 +1,2 @@ +#define USE_PTHREADS 1 +#include "../elf/tst-unwind-main.c" diff --git a/sysdeps/unix/sysv/linux/riscv/clone.S b/sysdeps/unix/sysv/linux/riscv/clone.S index 392af72b55..1c5b12566e 100644 --- a/sysdeps/unix/sysv/linux/riscv/clone.S +++ b/sysdeps/unix/sysv/linux/riscv/clone.S @@ -69,6 +69,11 @@ L (error): ENTRY (__thread_start) L (thread_start): + /* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + .cfi_label .Ldummy + cfi_undefined (ra) + /* Restore the arg for user's function. */ REG_L a1,0(sp) /* Function pointer. */ REG_L a0,SZREG(sp) /* Argument pointer. */ -- 2.20.1