libxl: ocaml: use int64 for timeval fields in the timeout_register callback
authorRob Hoes <rob.hoes@citrix.com>
Thu, 12 Dec 2013 16:36:50 +0000 (16:36 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 8 Jan 2014 14:11:17 +0000 (14:11 +0000)
The original code works fine on 64-bit, but on 32-bit, the OCaml int (which is
1 bit smaller than the C int) is likely to overflow.

Signed-off-by: Rob Hoes <rob.hoes@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
tools/ocaml/libs/xl/xenlight.mli.in
tools/ocaml/libs/xl/xenlight_stubs.c

index 794dbf1aa6f26f740c6cfcb8c3633f14b69404ce..b9819e12aeeab840e36921bfdc05614a09f76d68 100644 (file)
@@ -71,7 +71,7 @@ module Async : sig
                fd_register:('a -> Unix.file_descr -> event list -> for_libxl -> unit) ->
                fd_modify:('a -> Unix.file_descr -> event list -> unit) ->
                fd_deregister:('a -> Unix.file_descr -> unit) ->
-               timeout_register:('a -> int -> int -> for_libxl -> unit) ->
+               timeout_register:('a -> int64 -> int64 -> for_libxl -> unit) ->
                timeout_modify:('a -> unit) ->
                osevent_hooks
 
index a61c22263bcd6345688cac115c24aebe97decec9..2e2606a5397795ab9cb8b685ec49262c3d884b2c 100644 (file)
@@ -1286,6 +1286,7 @@ int timeout_register(void *user, void **for_app_registration_out,
 {
        caml_leave_blocking_section();
        CAMLparam0();
+       CAMLlocal2(sec, usec);
        CAMLlocalN(args, 4);
        static value *func = NULL;
        value *p = (value *) user;
@@ -1295,9 +1296,12 @@ int timeout_register(void *user, void **for_app_registration_out,
                func = caml_named_value("libxl_timeout_register");
        }
 
+       sec = caml_copy_int64(abs.tv_sec);
+       usec = caml_copy_int64(abs.tv_usec);
+
        args[0] = *p;
-       args[1] = Val_int(abs.tv_sec);
-       args[2] = Val_int(abs.tv_usec);
+       args[1] = sec;
+       args[2] = usec;
        args[3] = (value) for_libxl;
 
        caml_callbackN(*func, 4, args);