]> git.saurik.com Git - apple/xnu.git/blobdiff - libkdd/KCDBasicTypeDescription.m
xnu-4903.270.47.tar.gz
[apple/xnu.git] / libkdd / KCDBasicTypeDescription.m
index 5b8a54e874c515560a1b9eb5f40ed626f008a2b7..0a7b9457588882c683914b98a0b687b151d338a7 100644 (file)
@@ -90,20 +90,25 @@ KCDBasicTypeDescription () {
        return self;
 }
 
+#define read_unaligned(type, data) ({ \
+    type x; \
+    memcpy((void*)&x, (void*)(data), sizeof(type)); \
+    x; })
+
 - (NSObject *)objectForType:(kctype_subtype_t)elem_type withData:(uint8_t *)data
 {
        NSObject * obj;
 
        switch (elem_type) {
        case KC_ST_CHAR: obj = [NSString stringWithFormat:@"%c", *(char *)data]; break;
-       case KC_ST_INT8: obj = [NSNumber numberWithInt:*(int8_t *)data]; break;
-       case KC_ST_UINT8: obj = [NSNumber numberWithInt:*(uint8_t *)data]; break;
-       case KC_ST_INT16: obj = [NSNumber numberWithShort:*(int16_t *)data]; break;
-       case KC_ST_UINT16: obj = [NSNumber numberWithUnsignedShort:*(uint16_t *)data]; break;
-       case KC_ST_INT32: obj = [NSNumber numberWithInt:*(int32_t *)data]; break;
-       case KC_ST_UINT32: obj = [NSNumber numberWithUnsignedInt:*(uint32_t *)data]; break;
-       case KC_ST_INT64: obj = [NSNumber numberWithLongLong:*(int64_t *)data]; break;
-       case KC_ST_UINT64: obj = [NSNumber numberWithUnsignedLongLong:*(uint64_t *)data]; break;
+       case KC_ST_INT8: obj =   [NSNumber numberWithInt:read_unaligned(int8_t, data)]; break;
+       case KC_ST_UINT8: obj =  [NSNumber numberWithInt:read_unaligned(uint8_t, data)]; break;
+       case KC_ST_INT16: obj =  [NSNumber numberWithShort:read_unaligned(int16_t, data)]; break;
+       case KC_ST_UINT16: obj = [NSNumber numberWithUnsignedShort:read_unaligned(uint16_t, data)]; break;
+       case KC_ST_INT32: obj =  [NSNumber numberWithInt:read_unaligned(int32_t, data)]; break;
+       case KC_ST_UINT32: obj = [NSNumber numberWithUnsignedInt:read_unaligned(uint32_t, data)]; break;
+       case KC_ST_INT64: obj =  [NSNumber numberWithLongLong:read_unaligned(int64_t, data)]; break;
+       case KC_ST_UINT64: obj = [NSNumber numberWithUnsignedLongLong:read_unaligned(uint64_t, data)]; break;
 
        default: obj = @"<Unknown error occurred>"; break;
        }