-
Notifications
You must be signed in to change notification settings - Fork 119
Open
Labels
Description
Seems related to issue #119, but occurs in serialization. Extension built from master branch just an hour before, but confirmed with 2.2.0RC1 and 2.1.2 PECL builds as well - all affected.
$payload = 3119646122;
$pack = msgpack_pack($payload);
print bin2hex($pack[0]) . "\r\n";
$unpack = msgpack_unpack($pack);
var_dump($unpack);
On linux builds:
ce
int(3119646122)
On windows builds (VS17 x64 TS):
d2
int(-1175321174)
msgpack_pack is producing incorrectly 0xD2 (signed int32) type specifier, so it is not an unpacker issue.
It seems it is caused by long being 4 byte, while zend_long is correctly 8 byte in size. Therefore, msgpack_pack_long accepting long argument is truncating zend_long value, then invokes msgpack_pack_real_int32 treating it as signed 32-bit value. The correct behavior is observed after replacing msgpack_pack_long by msgpack_pack_long_long in msgpack_serialize_zval:
case IS_LONG:
msgpack_pack_long_long(buf, zval_get_long(val_noref));
break;