[ORC-RT] Fix objc selector corruption
authorBen Langmuir <blangmuir@apple.com>
Wed, 27 Oct 2021 22:39:51 +0000 (15:39 -0700)
committerBen Langmuir <blangmuir@apple.com>
Wed, 27 Oct 2021 23:02:52 +0000 (16:02 -0700)
We were writing a pointer to a selector string into the contents of a
string instead of overwriting the pointer to the string, leading to
corruption. This was causing non-deterministic failures of the
'trivial-objc-methods' test case.

Differential Revision: https://reviews.llvm.org/D112671

compiler-rt/lib/orc/macho_platform.cpp

index fac9918..e25b2a9 100644 (file)
@@ -112,10 +112,10 @@ Error registerObjCSelectors(
     if (auto Err = validatePointerSectionExtent("__objc_selrefs", ObjCSelRefs))
       return Err;
 
-    for (uintptr_t SelEntry : ObjCSelRefs.toSpan<uintptr_t>()) {
+    for (uintptr_t &SelEntry : ObjCSelRefs.toSpan<uintptr_t>()) {
       const char *SelName = reinterpret_cast<const char *>(SelEntry);
       auto Sel = sel_registerName(SelName);
-      *reinterpret_cast<SEL *>(SelEntry) = Sel;
+      *reinterpret_cast<SEL *>(&SelEntry) = Sel;
     }
   }