diff options
author | usama hameed <u_hameed@apple.com> | 2022-11-06 17:36:57 -0800 |
---|---|---|
committer | usama hameed <u_hameed@apple.com> | 2022-11-17 13:46:59 -0800 |
commit | 7052164f98a389d06a22ea54b673b25d634aa98a (patch) | |
tree | 7fecf3b963f90b7184bbda87fc8f20e4414ed194 | |
parent | 950f2486305078ce0e6fbc671fd4de4b4d33d246 (diff) | |
download | llvm-7052164f98a389d06a22ea54b673b25d634aa98a.zip llvm-7052164f98a389d06a22ea54b673b25d634aa98a.tar.gz llvm-7052164f98a389d06a22ea54b673b25d634aa98a.tar.bz2 |
[UBSan] Implementation NonUniqueARMRTTIBit __type_name has higher bits set on arm64
Differential Revision: https://reviews.llvm.org/D137518
-rw-r--r-- | compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp b/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp index d82b542..468a8fc 100644 --- a/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp +++ b/compiler-rt/lib/ubsan/ubsan_type_hash_itanium.cpp @@ -17,6 +17,7 @@ #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_ptrauth.h" +#include <stdint.h> // The following are intended to be binary compatible with the definitions // given in the Itanium ABI. We make no attempt to be ODR-compatible with @@ -25,9 +26,20 @@ namespace std { class type_info { public: + typedef const char *__type_name_t; virtual ~type_info(); const char *__type_name; + + __type_name_t name() const { +#if defined(__APPLE__) && defined(__LP64__) && !defined(__x86_64__) + uintptr_t __non_unique_rtti_bit = + (1ULL << ((__CHAR_BIT__ * sizeof(__type_name_t)) - 1)); + return (__type_name_t)((uintptr_t)__type_name & ~__non_unique_rtti_bit); +#else + return __type_name; +#endif + } }; } @@ -117,7 +129,7 @@ static __ubsan::HashValue *getTypeCacheHashTableBucket(__ubsan::HashValue V) { static bool isDerivedFromAtOffset(const abi::__class_type_info *Derived, const abi::__class_type_info *Base, sptr Offset) { - if (Derived->__type_name == Base->__type_name || + if (Derived->name() == Base->name() || __ubsan::checkTypeInfoEquality(Derived, Base)) return Offset == 0; @@ -254,17 +266,16 @@ __ubsan::getDynamicTypeInfoFromVtable(void *VtablePtr) { const abi::__class_type_info *ObjectType = findBaseAtOffset( static_cast<const abi::__class_type_info*>(Vtable->TypeInfo), -Vtable->Offset); - return DynamicTypeInfo(Vtable->TypeInfo->__type_name, -Vtable->Offset, - ObjectType ? ObjectType->__type_name : "<unknown>"); + return DynamicTypeInfo(Vtable->TypeInfo->name(), -Vtable->Offset, + ObjectType ? ObjectType->name() : "<unknown>"); } bool __ubsan::checkTypeInfoEquality(const void *TypeInfo1, const void *TypeInfo2) { auto TI1 = static_cast<const std::type_info *>(TypeInfo1); auto TI2 = static_cast<const std::type_info *>(TypeInfo2); - return SANITIZER_NON_UNIQUE_TYPEINFO && TI1->__type_name[0] != '*' && - TI2->__type_name[0] != '*' && - !internal_strcmp(TI1->__type_name, TI2->__type_name); + return SANITIZER_NON_UNIQUE_TYPEINFO && TI1->name()[0] != '*' && + TI2->name()[0] != '*' && !internal_strcmp(TI1->name(), TI2->name()); } #endif // CAN_SANITIZE_UB && !SANITIZER_WINDOWS |