Skip to content

Commit 9c995f7

Browse files
committed
Fix signing schemas?
1 parent 905477d commit 9c995f7

File tree

4 files changed

+8
-5
lines changed

4 files changed

+8
-5
lines changed

libcxxabi/src/cxa_personality.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context,
605605
const auto existingDiscriminator = ptrauth_blend_discriminator(
606606
&results.landingPad, ptrauth_string_discriminator(_LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC));
607607
unw_word_t newIP =
608-
(unw_word_t)ptrauth_auth_and_resign(*(void**)&results.landingPad, _LIBCXXABI_PTRAUTH_KEY, existingDiscriminator,
608+
(unw_word_t)ptrauth_auth_and_resign(*(void**)&results.landingPad, ptrauth_key_process_dependent_data, existingDiscriminator,
609609
ptrauth_key_return_address, stack_pointer);
610610
_Unwind_SetIP(context, newIP);
611611
#else

libunwind/src/DwarfInstructions.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ int DwarfInstructions<A, R>::stepWithDwarf(A &addressSpace,
305305

306306
isSignalFrame = cieInfo.isSignalFrame;
307307

308-
#if defined(_LIBUNWIND_TARGET_AARCH64)
308+
#if 0 && defined(_LIBUNWIND_TARGET_AARCH64)
309309
// If the target is aarch64 then the return address may have been signed
310310
// using the v8.3 pointer authentication extensions. The original
311311
// return address needs to be authenticated before the return address is

libunwind/src/DwarfParser.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,11 +409,14 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
409409
// schema. If we could guarantee the encoding of the personality we
410410
// could avoid this by simply giving resultAddr the correct ptrauth
411411
// schema and performing an assignment.
412+
const auto oldDiscriminator = ptrauth_blend_discriminator(
413+
(void*)resultAddr,
414+
ptrauth_string_discriminator("personality"));
412415
const auto discriminator = ptrauth_blend_discriminator(
413416
&cieInfo->personality,
414417
ptrauth_string_discriminator("CIE_Info::personality"));
415418
void *signedPtr = ptrauth_auth_and_resign(
416-
(void *)personality, ptrauth_key_function_pointer, resultAddr,
419+
(void *)personality, ptrauth_key_function_pointer, oldDiscriminator,
417420
ptrauth_key_function_pointer, discriminator);
418421
personality = (pint_t)signedPtr;
419422
}

libunwind/src/Registers.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,7 +2000,7 @@ inline bool Registers_arm64::validRegister(int regNum) const {
20002000

20012001
inline uint64_t Registers_arm64::getRegister(int regNum) const {
20022002
if (regNum == UNW_REG_IP || regNum == UNW_AARCH64_PC)
2003-
return _registers.__pc;
2003+
return getIP();
20042004
if (regNum == UNW_REG_SP || regNum == UNW_AARCH64_SP)
20052005
return _registers.__sp;
20062006
if (regNum == UNW_AARCH64_RA_SIGN_STATE)
@@ -2016,7 +2016,7 @@ inline uint64_t Registers_arm64::getRegister(int regNum) const {
20162016

20172017
inline void Registers_arm64::setRegister(int regNum, uint64_t value) {
20182018
if (regNum == UNW_REG_IP || regNum == UNW_AARCH64_PC)
2019-
_registers.__pc = value;
2019+
setIP(value);
20202020
else if (regNum == UNW_REG_SP || regNum == UNW_AARCH64_SP)
20212021
_registers.__sp = value;
20222022
else if (regNum == UNW_AARCH64_RA_SIGN_STATE)

0 commit comments

Comments
 (0)