summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2013-08-19 17:02:24 +0200
committerSebastian Dröge <slomo@circular-chaos.org>2013-08-19 17:02:24 +0200
commit3f98bc77a8a6056dc7674aa48c683eea2bd0c5b8 (patch)
tree870c5c28fd70885acee2c3f3332146937ffe6b85
parent90a7c923127371a27645477a37f86c426d14982b (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.c18
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;
}