diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2015-10-19 11:21:49 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2015-10-19 11:21:49 +0000 |
commit | 782d12c327ef0ac33e174e5961f1a53f463bca9c (patch) | |
tree | 3d413a136d2960da2d1b311a63556dcbb8fb5de4 | |
parent | c065a0995c0a18fcc2430977dbc887766b6ffe45 (diff) | |
download | ocaml-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.c | 12 | ||||
-rw-r--r-- | byterun/intern.c | 4 |
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; |