Skip to content

uint32 numbers are incorrectly serialized on Windows #163

Description

@bderleta

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;

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions