diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2013-08-19 17:02:24 +0200 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2013-08-19 17:02:24 +0200 |
commit | 3f98bc77a8a6056dc7674aa48c683eea2bd0c5b8 (patch) | |
tree | 870c5c28fd70885acee2c3f3332146937ffe6b85 | |
parent | 90a7c923127371a27645477a37f86c426d14982b (diff) |
orcbytecode: Fix parsing of 64 bit values from bytecode
The shift by 24 bits has to be casted already, otherwise we shift
into the sign bit which causes undefined behaviour.
Thanks to Edward Hervey for debugging this.
https://bugzilla.gnome.org/show_bug.cgi?id=698520
-rw-r--r-- | orc/orcbytecode.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/orc/orcbytecode.c b/orc/orcbytecode.c index 19af32c..816d154 100644 --- a/orc/orcbytecode.c +++ b/orc/orcbytecode.c @@ -359,14 +359,16 @@ orc_uint64 orc_bytecode_parse_get_uint64 (OrcBytecodeParse *parse) { orc_uint64 value; - value = orc_bytecode_parse_get_byte (parse); - value |= orc_bytecode_parse_get_byte (parse) << 8; - value |= orc_bytecode_parse_get_byte (parse) << 16; - value |= orc_bytecode_parse_get_byte (parse) << 24; - value |= (orc_uint64)orc_bytecode_parse_get_byte (parse) << 32; - value |= (orc_uint64)orc_bytecode_parse_get_byte (parse) << 40; - value |= (orc_uint64)orc_bytecode_parse_get_byte (parse) << 48; - value |= (orc_uint64)orc_bytecode_parse_get_byte (parse) << 56; + + value = ((orc_uint64)orc_bytecode_parse_get_byte (parse)); + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 8; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 16; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 24; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 32; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 40; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 48; + value |= ((orc_uint64)orc_bytecode_parse_get_byte (parse)) << 56; + return value; } |