OCaml memory allocation functions use words as units,
unless explicitly documented otherwise.
Thus we were allocating more memory than necessary,
caml_alloc should've been called with the parameter '2',
but was called with a lot more.
To account for future changes in the struct keep using sizeof,
but round up and convert to number of words.
For OCaml 1 word = sizeof(value)
The Wsize_bsize macro converts bytes to words.
Signed-off-by: Edwin Török <edvin.torok@citrix.com>
---
tools/ocaml/libs/mmap/xenmmap_stubs.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/ocaml/libs/mmap/xenmmap_stubs.c b/tools/ocaml/libs/mmap/xenmmap_stubs.c
index b811990a89..4d09c5a6e6 100644
--- a/tools/ocaml/libs/mmap/xenmmap_stubs.c
+++ b/tools/ocaml/libs/mmap/xenmmap_stubs.c
@@ -28,6 +28,8 @@
#include <caml/fail.h>
#include <caml/callback.h>
+#define Wsize_bsize_round(n) (Wsize_bsize( (n) + sizeof(value) - 1 ))
+
static int mmap_interface_init(struct mmap_interface *intf,
int fd, int pflag, int mflag,
int len, int offset)
@@ -57,7 +59,7 @@ CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
default: caml_invalid_argument("maptype");
}
- result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
+ result = caml_alloc(Wsize_bsize_round(sizeof(struct mmap_interface)), Abstract_tag);
if (mmap_interface_init(Intf_val(result), Int_val(fd),
c_pflag, c_mflag,
--
2.25.1