]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
aarch64: Fix async_fibre_swapcontext() on clang BTI builds
authorTom Cosgrove <tom.cosgrove@arm.com>
Mon, 14 Feb 2022 11:23:57 +0000 (11:23 +0000)
committerPauli <pauli@openssl.org>
Mon, 28 Feb 2022 22:51:29 +0000 (09:51 +1100)
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 <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17698)

crypto/async/arch/async_posix.h

index eeb7774512281dfa911f6572ce848dbdce54a690..57da6e211f12340bdbd0eb74af7f56c3649b5417 100644 (file)
  */
 #   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 <ucontext.h>
 #  ifndef USE_SWAPCONTEXT
 #   include <setjmp.h>