summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2015-10-19 11:21:49 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2015-10-19 11:21:49 +0000
commit782d12c327ef0ac33e174e5961f1a53f463bca9c (patch)
tree3d413a136d2960da2d1b311a63556dcbb8fb5de4
parentc065a0995c0a18fcc2430977dbc887766b6ffe45 (diff)
downloadocaml-big-marshal.tar.gz
Minor fixes following the discussion on pull request 224:big-marshal
- intern.c: watch out for left shift overflow - extern.c: refactor caml_output_value_to_block git-svn-id: http://caml.inria.fr/svn/ocaml/branches/big-marshal@16522 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--byterun/extern.c12
-rw-r--r--byterun/intern.c4
2 files changed, 6 insertions, 10 deletions
diff --git a/byterun/extern.c b/byterun/extern.c
index b61a9776c1..abce63123a 100644
--- a/byterun/extern.c
+++ b/byterun/extern.c
@@ -715,19 +715,15 @@ CAMLexport intnat caml_output_value_to_block(value v, value flags,
extern_ptr = extern_userprovided_output;
extern_limit = buf + len;
data_len = extern_value(v, flags, header, &header_len);
- if (header_len == 20) {
- /* Good guess! */
- memcpy(buf, header, 20);
- return 20 + data_len;
- } else {
- /* Need to shift the output to make room for big header.
+ if (header_len != 20) {
+ /* Bad guess! Need to shift the output to make room for big header.
Make sure there is room. */
if (header_len + data_len > len)
caml_failwith("Marshal.to_buffer: buffer overflow");
memmove(buf + header_len, buf + 20, data_len);
- memcpy(buf, header, header_len);
- return header_len + data_len;
}
+ memcpy(buf, header, header_len);
+ return header_len + data_len;
}
CAMLprim value caml_output_value_to_buffer(value buf, value ofs, value len,
diff --git a/byterun/intern.c b/byterun/intern.c
index 6f26b65360..828743fb98 100644
--- a/byterun/intern.c
+++ b/byterun/intern.c
@@ -96,7 +96,7 @@ static inline int16_t read16s(void)
static inline uint32_t read32u(void)
{
uint32_t res =
- (intern_src[0] << 24) + (intern_src[1] << 16)
+ ((uint32_t)(intern_src[0]) << 24) + (intern_src[1] << 16)
+ (intern_src[2] << 8) + intern_src[3];
intern_src += 4;
return res;
@@ -105,7 +105,7 @@ static inline uint32_t read32u(void)
static inline int32_t read32s(void)
{
int32_t res =
- (intern_src[0] << 24) + (intern_src[1] << 16)
+ ((uint32_t)(intern_src[0]) << 24) + (intern_src[1] << 16)
+ (intern_src[2] << 8) + intern_src[3];
intern_src += 4;
return res;