From: Tom Cosgrove Date: Mon, 14 Feb 2022 11:23:57 +0000 (+0000) Subject: aarch64: Fix async_fibre_swapcontext() on clang BTI builds X-Git-Tag: openssl-3.2.0-alpha1~2903 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2d2401aed7ff45f4c013201944e1218dce12da7;p=thirdparty%2Fopenssl.git aarch64: Fix async_fibre_swapcontext() on clang BTI builds Reverting to using swapcontext() when compiling with clang on BTI-enabled builds fixes the BTI setjmp() failure seen when running asynctest. The issue with setjmp/longjmp is a known clang bug: see https://github.com/llvm/llvm-project/issues/48888 Change-Id: I6eeaaa2e15f402789f1b3e742038f84bef846e29 Reviewed-by: Matt Caswell Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/17698) --- diff --git a/crypto/async/arch/async_posix.h b/crypto/async/arch/async_posix.h index eeb77745122..57da6e211f1 100644 --- a/crypto/async/arch/async_posix.h +++ b/crypto/async/arch/async_posix.h @@ -36,6 +36,18 @@ */ # define USE_SWAPCONTEXT # endif +# if defined(__aarch64__) && defined(__clang__) \ + && defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1 +/* + * setjmp/longjmp don't currently work with BTI on all libc implementations + * when compiled by clang. This is because clang doesn't put a BTI after the + * call to setjmp where it returns the second time. This then fails on libc + * implementations - notably glibc - which use an indirect jump to there. + * So use the swapcontext implementation, which does work. + * See https://github.com/llvm/llvm-project/issues/48888. + */ +# define USE_SWAPCONTEXT +# endif # include # ifndef USE_SWAPCONTEXT # include