Loading...
libkern/c++/OSSerializeBinary.cpp xnu-8792.61.2 xnu-8796.121.2
--- xnu/xnu-8792.61.2/libkern/c++/OSSerializeBinary.cpp
+++ xnu/xnu-8796.121.2/libkern/c++/OSSerializeBinary.cpp
@@ -372,7 +372,10 @@
 	const uint32_t * next;
 	uint32_t         key, len, wordLen, length;
 	bool             end, newCollect, isRef;
-	unsigned long long value;
+	union {
+		unsigned long long value;
+		double fpValue;
+	} value;
 	bool ok, indexed, hasLength;
 
 	indexed = false;
@@ -455,13 +458,23 @@
 			if (bufferPos > bufferSize) {
 				break;
 			}
-			if ((len != 32) && (len != 64) && (len != 16) && (len != 8)) {
-				break;
-			}
-			value = next[1];
-			value <<= 32;
-			value |= next[0];
-			o = OSNumber::withNumber(value, len);
+			value.value = next[1];
+			value.value <<= 32;
+			value.value |= next[0];
+			switch (len) {
+			case 63:
+				o = OSNumber::withDouble(value.fpValue);
+				break;
+			case 31:
+				o = OSNumber::withFloat((float) value.fpValue);
+				break;
+			case 64:
+			case 32:
+			case 16:
+			case 8:
+				o = OSNumber::withNumber(value.value, len);
+				break;
+			}
 			next += 2;
 			break;