Skip to content

Commit 8b01751

Browse files
committed
MetadataReader: Fix reading obfuscated tagged pointers
Turns out the tags are shuffled around by XORing with a per-process hash, and we have to deobfuscate the tag before checking if its an extended tag. There's no test for this; just running the existing tests several times in a row is sufficient to trigger the problem.
1 parent 09e0937 commit 8b01751

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ class MetadataReader {
222222
StoredPointer TaggedPointerExtendedSlotShift;
223223
StoredPointer TaggedPointerExtendedSlotMask;
224224
StoredPointer TaggedPointerExtendedClasses;
225+
StoredPointer TaggedPointerObfuscator;
225226

226227
Demangle::NodeFactory Factory;
227228

@@ -744,7 +745,7 @@ class MetadataReader {
744745
if (getTaggedPointerEncoding() != TaggedPointerEncodingKind::Extended)
745746
return false;
746747

747-
return objectAddress & TaggedPointerMask;
748+
return (objectAddress ^ TaggedPointerObfuscator) & TaggedPointerMask;
748749
}
749750

750751
/// Read the isa pointer of an Object-C tagged pointer value.
@@ -761,8 +762,8 @@ class MetadataReader {
761762

762763
// Extended pointers have a tag of 0b111, using 8 additional bits
763764
// to specify the class.
764-
if (TaggedPointerExtendedMask != 0 &&
765-
((objectAddress & TaggedPointerExtendedMask)
765+
if (TaggedPointerExtendedMask != 0 &&
766+
(((objectAddress ^ TaggedPointerObfuscator) & TaggedPointerExtendedMask)
766767
== TaggedPointerExtendedMask)) {
767768
auto tag = ((objectAddress >> TaggedPointerExtendedSlotShift) &
768769
TaggedPointerExtendedSlotMask);
@@ -2469,6 +2470,9 @@ class MetadataReader {
24692470
TaggedPointerExtendedClasses =
24702471
TaggedPointerExtendedClassesAddr.getAddressData();
24712472

2473+
tryFindAndReadSymbol(TaggedPointerObfuscator,
2474+
"objc_debug_taggedpointer_obfuscator");
2475+
24722476
# undef tryFindSymbol
24732477
# undef tryReadSymbol
24742478
# undef tryFindAndReadSymbol

0 commit comments

Comments
 (0)