orcbytecode: Fix parsing of 64 bit values from bytecode
authorSebastian Dröge <slomo@circular-chaos.org>
Mon, 19 Aug 2013 15:02:24 +0000 (17:02 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Mon, 19 Aug 2013 15:02:24 +0000 (17:02 +0200)
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

orc/orcbytecode.c

index 19af32c..816d154 100644 (file)
@@ -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;
 }