libunwind: Don't attempt to authenticate a null return address.
authorPeter Collingbourne <peter@pcc.me.uk>
Fri, 12 Feb 2021 00:16:51 +0000 (16:16 -0800)
committerPeter Collingbourne <peter@pcc.me.uk>
Tue, 16 Feb 2021 19:18:02 +0000 (11:18 -0800)
Null return addresses can appear at the bottom of the stack (i.e. the
frame corresponding to the entry point). Authenticating these addresses
will set the error code in the address, which will lead to a segfault
in the sigreturn trampoline detection code. Fix this problem by not
authenticating null addresses.

Differential Revision: https://reviews.llvm.org/D96560

libunwind/src/DwarfInstructions.hpp

index c39cabe..bd13d16 100644 (file)
@@ -213,7 +213,8 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace, pint_t pc,
       // restored. autia1716 is used instead of autia as autia1716 assembles
       // to a NOP on pre-v8.3a architectures.
       if ((R::getArch() == REGISTERS_ARM64) &&
-          prolog.savedRegisters[UNW_ARM64_RA_SIGN_STATE].value) {
+          prolog.savedRegisters[UNW_ARM64_RA_SIGN_STATE].value &&
+          returnAddress != 0) {
 #if !defined(_LIBUNWIND_IS_NATIVE_ONLY)
         return UNW_ECROSSRASIGNING;
 #else