X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=ocaml%2Fguestfs_c.c;h=43a85b800dbdc85b3f6068e9280cfe893e1de4aa;hp=87139b487277ee1c25060eee16db8cea4dc49062;hb=f8f10578093e926f5f36289a6c11615d067fbcad;hpb=b3f11c5f62f725fa3f09452b38d52dba764f80d0 diff --git a/ocaml/guestfs_c.c b/ocaml/guestfs_c.c index 87139b4..43a85b8 100644 --- a/ocaml/guestfs_c.c +++ b/ocaml/guestfs_c.c @@ -32,6 +32,15 @@ #include "guestfs_c.h" +/* This macro was added in OCaml 3.10. Backport for earlier versions. */ +#ifndef CAMLreturnT +#define CAMLreturnT(type, result) do{ \ + type caml__temp_result = (result); \ + caml_local_roots = caml__frame; \ + return (caml__temp_result); \ +}while(0) +#endif + /* Allocate handles and deal with finalization. */ static void guestfs_finalize (value gv) @@ -111,15 +120,19 @@ ocaml_guestfs_close (value gv) CAMLreturn (Val_unit); } -/* Copy string array value. */ +/* Copy string array value. + * The return value is only 'safe' provided we don't allocate anything + * further on the OCaml heap (ie. cannot trigger the OCaml GC) because + * that could move the strings around. + */ char ** -ocaml_guestfs_strings_val (value sv) +ocaml_guestfs_strings_val (guestfs_h *g, value sv) { CAMLparam1 (sv); char **r; int i; - r = malloc (sizeof (char *) * (Wosize_val (sv) + 1)); + r = guestfs_safe_malloc (g, sizeof (char *) * (Wosize_val (sv) + 1)); for (i = 0; i < Wosize_val (sv); ++i) r[i] = String_val (Field (sv, i)); r[i] = NULL;