================
@@ -557,7 +596,19 @@ set_registers(_Unwind_Exception* unwind_exception, 
_Unwind_Context* context,
                 reinterpret_cast<uintptr_t>(unwind_exception));
   _Unwind_SetGR(context, __builtin_eh_return_data_regno(1),
                 static_cast<uintptr_t>(results.ttypeIndex));
+#if defined(__APPLE__) && __has_feature(ptrauth_qualifier)
+  auto stack_pointer = _Unwind_GetGR(context, UNW_REG_SP);
+  // We manually re-sign the IP as the __ptrauth qualifiers cannot
+  // express the required relationship with the destination address
+  const auto existingDiscriminator = ptrauth_blend_discriminator(
+      &results.landingPad, 
ptrauth_string_discriminator(_LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC));
+  unw_word_t newIP =
+      (unw_word_t)ptrauth_auth_and_resign(*(void**)&results.landingPad, 
_LIBCXXABI_PTRAUTH_KEY, existingDiscriminator,
+                                          ptrauth_key_return_address, 
stack_pointer);
+  _Unwind_SetIP(context, newIP);
+#else
----------------
atrosinenko wrote:

Same as in `compiler-rt/lib/builtins/gcc_personality_v0.c`, do we need an 
implementation "in between" completely unprotected pointers and full 
hand-written hardening when only pac-ret is enabled?

https://github.com/llvm/llvm-project/pull/143230
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to