From: Andrew Cooper Date: Tue, 31 Jan 2023 10:59:42 +0000 (+0000) Subject: tools/ocaml/libs: Allocate the correct amount of memory for Abstract_tag X-Git-Tag: 4.18.0-rc1~1134 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=36eb2de31b6ecb8787698fb1a701bd708c8971b2;p=xen.git tools/ocaml/libs: Allocate the correct amount of memory for Abstract_tag caml_alloc() takes units of Wsize (word size), not bytes. As a consequence, we're allocating 4 or 8 times too much memory. Ocaml has a helper, Wsize_bsize(), but it truncates cases which aren't an exact multiple. Use a BUILD_BUG_ON() to cover the potential for truncation, as there's no rounding-up form of the helper. Fixes: 8b7ce06a2d34 ("ocaml: Add XC bindings.") Fixes: d3e649277a13 ("ocaml: add mmap bindings implementation.") Signed-off-by: Andrew Cooper Acked-by: Christian Lindig --- diff --git a/tools/ocaml/libs/mmap/Makefile b/tools/ocaml/libs/mmap/Makefile index a621537135..855b8b2c98 100644 --- a/tools/ocaml/libs/mmap/Makefile +++ b/tools/ocaml/libs/mmap/Makefile @@ -2,6 +2,8 @@ OCAML_TOPLEVEL=$(CURDIR)/../.. XEN_ROOT=$(OCAML_TOPLEVEL)/../.. include $(OCAML_TOPLEVEL)/common.make +CFLAGS += $(CFLAGS_xeninclude) + OBJS = xenmmap INTF = $(foreach obj, $(OBJS),$(obj).cmi) LIBS = xenmmap.cma xenmmap.cmxa diff --git a/tools/ocaml/libs/mmap/xenmmap_stubs.c b/tools/ocaml/libs/mmap/xenmmap_stubs.c index e03951d781..d623ad390e 100644 --- a/tools/ocaml/libs/mmap/xenmmap_stubs.c +++ b/tools/ocaml/libs/mmap/xenmmap_stubs.c @@ -21,6 +21,8 @@ #include #include "mmap_stubs.h" +#include + #include #include #include @@ -59,7 +61,9 @@ 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); + BUILD_BUG_ON((sizeof(struct mmap_interface) % sizeof(value)) != 0); + result = caml_alloc(Wsize_bsize(sizeof(struct mmap_interface)), + Abstract_tag); if (mmap_interface_init(Intf_val(result), Int_val(fd), c_pflag, c_mflag, diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index 7288184459..fd1f306f02 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -1031,7 +1031,10 @@ CAMLprim value stub_map_foreign_range(value xch, value dom, uint32_t c_dom; unsigned long c_mfn; - result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag); + BUILD_BUG_ON((sizeof(struct mmap_interface) % sizeof(value)) != 0); + result = caml_alloc(Wsize_bsize(sizeof(struct mmap_interface)), + Abstract_tag); + intf = (struct mmap_interface *) result; intf->len = Int_val(size);