]> git.saurik.com Git - cycript.git/commitdiff
Struct field access must be mindful of alignments.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 22 Dec 2015 15:31:44 +0000 (07:31 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 22 Dec 2015 15:31:44 +0000 (07:31 -0800)
Execute.cpp

index 6bf9b500459eb8bcc6b30e54755e6aa5179e0a94..6581ee1138f0910a02e833ff66cafe17c2f3787a 100644 (file)
@@ -890,6 +890,11 @@ static bool CString_setProperty(JSContextRef context, JSObjectRef object, JSStri
     return true;
 } CYCatch(false) }
 
+template <typename Type_>
+static void Align(Type_ &data, size_t size) {
+    data = reinterpret_cast<Type_>((reinterpret_cast<uintptr_t>(data) + (size - 1)) & ~(size - 1));
+}
+
 static bool Index_(CYPool &pool, JSContextRef context, Struct_privateData *internal, JSStringRef property, ssize_t &index, uint8_t *&base) {
     Type_privateData *typical(internal->type_);
     sig::Type *type(typical->type_);
@@ -927,9 +932,12 @@ static bool Index_(CYPool &pool, JSContextRef context, Struct_privateData *inter
     ffi_type **elements(typical->GetFFI()->elements);
 
     base = reinterpret_cast<uint8_t *>(internal->value_);
-    for (ssize_t local(0); local != index; ++local)
+    for (ssize_t local(0); local != index; ++local) {
+        Align(base, elements[local]->alignment);
         base += elements[local]->size;
+    }
 
+    Align(base, elements[index]->alignment);
     return true;
 }