From nobody Tue Jan 31 01:47:12 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4P5SbP0BS3z3c3ZY; Tue, 31 Jan 2023 01:47:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P5SbN5BLnz4dPq; Tue, 31 Jan 2023 01:47:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675129632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mPrX6noN91dI1sRl3A/bGuOEY4aBg9vEZu7Hqi3RY7Y=; b=UhIYhZzItYAGWH6PHgc+CPLc7HqZOnWxoDesloankFlrBQvQ0Akpxz3MaDXF34EtesTO1b fKtmXE4Wn1XKOZJDVuhUDfuZzkd0O9TVngXEJ5GoTPKb9q/P/ZxqwqnZ+boCUQpc+QBI3u jn77M3YD57HnTdjjxyu1NBDu2cRey8y/HCXxqZgDFuIEmZRiEs53I5BVukyLAFrmtBrrMV nmTMiKbmRBOS+ltJbBYJnUIqno3XoyPQdrqsiuxIXBQf3NqgbXCkbNjakmNmY1bdaL/YmI PCsMswvaUlJQS7SH4V06gxJtkNX/hW9/X3rSpVCZI+ind0yPNPDPr1Wwp+6yLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675129632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=mPrX6noN91dI1sRl3A/bGuOEY4aBg9vEZu7Hqi3RY7Y=; b=sAarrxQwjQDTpXjEAzN8LvpaH7EZTSF0qXC0Ot03PMjFCusqzED4D0kt08vY0JrW6riRFz VjJ/WXBU0LL25LMR1/p8JeDi6y5RVQ6+FudSz4D0EBkEkyZ7KfgYHV4QdQez6vYjmJnry4 yvI6rVr1dggYoVvitgMUUctRKMdSQrqp/Lye4K1IaNvcXN7q5cQBhyp4nER3K8hX2WeXmc NAgg+nwc7iEsEp3uDCEvtt9I48yllMNCsY3pnnfo3mUDulzD6PkA2bVwOZLbGOo9RKx4f6 EnFT14U5Weh36JcAyFxJO6bfzbcHIVWfO96+GDeovJJ1FI0iesXvmT439cGOhg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1675129632; a=rsa-sha256; cv=none; b=VmuBg6rU+hacSzwgqWStAE0nc8XNwpfk5nxBF7JryOeIy9SNDDow5uCz9IR75/9C3LwGmP IyKxC3GGhW/7X4o5vN+zMIrlgswOHmzU54zi3nipSDXMMMWxpnLTeQdMxlTNLM4P8kifxs ksuWx6mYrtLjsTBvCKx2B3ge7qT2IX1MgP20SwMlaqdXcZTRGGMaJu5OhO/UUpO39+DD7g c3tUfnNJbQJ6KmfzvUViTUtru2GLXk91SoQrZZ9PHJ1JXIJ67ZRg8nbZ/IkQW4QKgVsU4a T8BooD4JCa8kse1Kk/K/pgh0qXYfIYaeXA8uXm96DYsYJz2WJSBWM1rx9Ok18Q== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4P5SbN3KxnzW5h; Tue, 31 Jan 2023 01:47:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30V1lCt6058665; Tue, 31 Jan 2023 01:47:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30V1lC64058664; Tue, 31 Jan 2023 01:47:12 GMT (envelope-from git) Date: Tue, 31 Jan 2023 01:47:12 GMT Message-Id: <202301310147.30V1lC64058664@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jessica Clarke Subject: git: cc58b7123be2 - stable/13 - libc: Fix longjmp/_longjmp(buf, 0) for AArch64 and RISC-V List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jrtc27 X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: cc58b7123be2862237746a37c1d658d0d5ca8b13 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=cc58b7123be2862237746a37c1d658d0d5ca8b13 commit cc58b7123be2862237746a37c1d658d0d5ca8b13 Author: Jessica Clarke AuthorDate: 2023-01-09 18:34:43 +0000 Commit: Jessica Clarke CommitDate: 2023-01-31 01:46:18 +0000 libc: Fix longjmp/_longjmp(buf, 0) for AArch64 and RISC-V These architectures fail to handle this special case, and will cause the corresponding setjmp/_setjmp to return 0 rather than 1. Fix this and add regression tests (also committed upstream). PR: 268684 Reviewed by: arichardson, jhb MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D29363 (cherry picked from commit 9fb118bebced1452a46756a13be0161021b10905) --- contrib/netbsd-tests/lib/libc/setjmp/t_setjmp.c | 50 ++++++++++++++++++++++--- lib/libc/aarch64/gen/_setjmp.S | 3 +- lib/libc/aarch64/gen/setjmp.S | 3 +- lib/libc/riscv/gen/_setjmp.S | 3 ++ lib/libc/riscv/gen/setjmp.S | 3 ++ 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/contrib/netbsd-tests/lib/libc/setjmp/t_setjmp.c b/contrib/netbsd-tests/lib/libc/setjmp/t_setjmp.c index 1f0f1ed5ea89..1b1baa584468 100644 --- a/contrib/netbsd-tests/lib/libc/setjmp/t_setjmp.c +++ b/contrib/netbsd-tests/lib/libc/setjmp/t_setjmp.c @@ -70,6 +70,7 @@ __RCSID("$NetBSD: t_setjmp.c,v 1.2 2017/01/14 21:08:17 christos Exp $"); #include #include #include +#include #include #include #include @@ -83,6 +84,8 @@ __RCSID("$NetBSD: t_setjmp.c,v 1.2 2017/01/14 21:08:17 christos Exp $"); #define TEST_U_SETJMP 1 #define TEST_SIGSETJMP_SAVE 2 #define TEST_SIGSETJMP_NOSAVE 3 +#define TEST_LONGJMP_ZERO 4 +#define TEST_U_LONGJMP_ZERO 5 static int expectsignal; @@ -101,12 +104,16 @@ h_check(int test) sigjmp_buf sjb; sigset_t ss; int i, x; + volatile bool did_longjmp; i = getpid(); + did_longjmp = false; - if (test == TEST_SETJMP || test == TEST_SIGSETJMP_SAVE) + if (test == TEST_SETJMP || test == TEST_SIGSETJMP_SAVE || + test == TEST_LONGJMP_ZERO) expectsignal = 0; - else if (test == TEST_U_SETJMP || test == TEST_SIGSETJMP_NOSAVE) + else if (test == TEST_U_SETJMP || test == TEST_SIGSETJMP_NOSAVE || + test == TEST_U_LONGJMP_ZERO) expectsignal = 1; else atf_tc_fail("unknown test"); @@ -119,26 +126,37 @@ h_check(int test) REQUIRE_ERRNO(sigaddset(&ss, SIGABRT) != -1); REQUIRE_ERRNO(sigprocmask(SIG_BLOCK, &ss, NULL) != -1); - if (test == TEST_SETJMP) + if (test == TEST_SETJMP || test == TEST_LONGJMP_ZERO) x = setjmp(jb); - else if (test == TEST_U_SETJMP) + else if (test == TEST_U_SETJMP || test == TEST_U_LONGJMP_ZERO) x = _setjmp(jb); else x = sigsetjmp(sjb, !expectsignal); if (x != 0) { - ATF_REQUIRE_MSG(x == i, "setjmp returned wrong value"); + if (test == TEST_LONGJMP_ZERO || test == TEST_U_LONGJMP_ZERO) + ATF_REQUIRE_MSG(x == 1, "setjmp returned wrong value"); + else + ATF_REQUIRE_MSG(x == i, "setjmp returned wrong value"); + kill(i, SIGABRT); ATF_REQUIRE_MSG(!expectsignal, "kill(SIGABRT) failed"); atf_tc_pass(); + } else if (did_longjmp) { + atf_tc_fail("setjmp returned zero after longjmp"); } REQUIRE_ERRNO(sigprocmask(SIG_UNBLOCK, &ss, NULL) != -1); + did_longjmp = true; if (test == TEST_SETJMP) longjmp(jb, i); + else if (test == TEST_LONGJMP_ZERO) + longjmp(jb, 0); else if (test == TEST_U_SETJMP) _longjmp(jb, i); + else if (test == TEST_U_LONGJMP_ZERO) + _longjmp(jb, 0); else siglongjmp(sjb, i); @@ -185,12 +203,34 @@ ATF_TC_BODY(sigsetjmp_nosave, tc) h_check(TEST_SIGSETJMP_NOSAVE); } +ATF_TC(longjmp_zero); +ATF_TC_HEAD(longjmp_zero, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks longjmp(3) with a zero value"); +} +ATF_TC_BODY(longjmp_zero, tc) +{ + h_check(TEST_LONGJMP_ZERO); +} + +ATF_TC(_longjmp_zero); +ATF_TC_HEAD(_longjmp_zero, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks _longjmp(3) with a zero value"); +} +ATF_TC_BODY(_longjmp_zero, tc) +{ + h_check(TEST_U_LONGJMP_ZERO); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, setjmp); ATF_TP_ADD_TC(tp, _setjmp); ATF_TP_ADD_TC(tp, sigsetjmp_save); ATF_TP_ADD_TC(tp, sigsetjmp_nosave); + ATF_TP_ADD_TC(tp, longjmp_zero); + ATF_TP_ADD_TC(tp, _longjmp_zero); return atf_no_error(); } diff --git a/lib/libc/aarch64/gen/_setjmp.S b/lib/libc/aarch64/gen/_setjmp.S index 49bf4df4f524..94a58d774f2b 100644 --- a/lib/libc/aarch64/gen/_setjmp.S +++ b/lib/libc/aarch64/gen/_setjmp.S @@ -91,7 +91,8 @@ ENTRY(_longjmp) #endif /* Load the return value */ - mov x0, x1 + cmp x1, #0 + csinc x0, x1, xzr, ne ret botch: diff --git a/lib/libc/aarch64/gen/setjmp.S b/lib/libc/aarch64/gen/setjmp.S index b302594ff549..e6cdba801e19 100644 --- a/lib/libc/aarch64/gen/setjmp.S +++ b/lib/libc/aarch64/gen/setjmp.S @@ -113,7 +113,8 @@ ENTRY(longjmp) ldp d14, d15, [x0] /* Load the return value */ - mov x0, x1 + cmp x1, #0 + csinc x0, x1, xzr, ne ret botch: diff --git a/lib/libc/riscv/gen/_setjmp.S b/lib/libc/riscv/gen/_setjmp.S index ded6705ef7ee..94b4e90b6f42 100644 --- a/lib/libc/riscv/gen/_setjmp.S +++ b/lib/libc/riscv/gen/_setjmp.S @@ -131,6 +131,9 @@ ENTRY(_longjmp) /* Load the return value */ mv a0, a1 + bnez a1, 1f + li a0, 1 +1: ret botch: diff --git a/lib/libc/riscv/gen/setjmp.S b/lib/libc/riscv/gen/setjmp.S index c0458e907ce0..1d5b4d5fc0ca 100644 --- a/lib/libc/riscv/gen/setjmp.S +++ b/lib/libc/riscv/gen/setjmp.S @@ -161,6 +161,9 @@ ENTRY(longjmp) /* Load the return value */ mv a0, a1 + bnez a1, 1f + li a0, 1 +1: ret botch: