[compiler-rt] [libcxxabi] [libunwind] [runtimes][PAC] Harden unwinding when possible (#138571) (PR #143230)

Anatoly Trosinenko via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 25 12:55:44 PDT 2025


================
@@ -377,13 +395,32 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
       case 'z':
         cieInfo->fdesHaveAugmentationData = true;
         break;
-      case 'P':
+      case 'P': {
         cieInfo->personalityEncoding = addressSpace.get8(p);
         ++p;
         cieInfo->personalityOffsetInCIE = (uint8_t)(p - cie);
-        cieInfo->personality = addressSpace
-            .getEncodedP(p, cieContentEnd, cieInfo->personalityEncoding);
+        pint_t personality = addressSpace.getEncodedP(
+            p, cieContentEnd, cieInfo->personalityEncoding,
+            /*datarelBase=*/0, &resultAddr);
+#if __has_feature(ptrauth_calls)
+        if (personality) {
+          // The GOT for the personality function was signed address
+          // authenticated. Manually re-sign with the CIE_Info::personality
+          // schema. If we could guarantee the encoding of the personality we
+          // could avoid this by simply giving resultAddr the correct ptrauth
+          // schema and performing an assignment.
+          const auto discriminator = ptrauth_blend_discriminator(
+              &cieInfo->personality,
+              ptrauth_string_discriminator("CIE_Info::personality"));
+          void *signedPtr = ptrauth_auth_and_resign(
+              (void *)personality, ptrauth_key_function_pointer, resultAddr,
----------------
atrosinenko wrote:

In my configuration, I had to use
```cpp
          const auto oldDiscriminator = ptrauth_blend_discriminator(
              (void*)resultAddr,
              ptrauth_string_discriminator("personality"));
```
instead of plain `resultAddr`. This may be `pauthtest`-abi-specific.

https://github.com/llvm/llvm-project/pull/143230


More information about the cfe-commits mailing list