[Libguestfs] [PATCH nbdkit 2/3] ocaml: Use int64 as the OCaml type for counts

Richard W.M. Jones rjones at redhat.com
Sat Jan 15 12:35:12 UTC 2022


We previously mapped the C type uint32_t count to int32.  However this
will cause a negative number to be passed for counts >= 2G.  This is
theoretically not wrong, but could obviously cause problems for
plugins which are not prepared to deal with a negative count (by
converting it to int64 and adding 0x1_0000_0000).

As well as future-proofing the plugin, it's easier for us to just pass
counts as int64.

Note I did not change pread - see next commit.
---
 plugins/ocaml/NBDKit.mli | 8 ++++----
 plugins/ocaml/plugin.c   | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/plugins/ocaml/NBDKit.mli b/plugins/ocaml/NBDKit.mli
index 198c250b..dc83c9e9 100644
--- a/plugins/ocaml/NBDKit.mli
+++ b/plugins/ocaml/NBDKit.mli
@@ -111,10 +111,10 @@ val register_plugin :
   pread: ('a -> int32 -> int64 -> flags -> string) ->
   ?pwrite: ('a -> string -> int64 -> flags -> unit) ->
   ?flush: ('a -> flags -> unit) ->
-  ?trim: ('a -> int32 -> int64 -> flags -> unit) ->
-  ?zero: ('a -> int32 -> int64 -> flags -> unit) ->
-  ?extents: ('a -> int32 -> int64 -> flags -> extent list) ->
-  ?cache: ('a -> int32 -> int64 -> flags -> unit) ->
+  ?trim: ('a -> int64 -> int64 -> flags -> unit) ->
+  ?zero: ('a -> int64 -> int64 -> flags -> unit) ->
+  ?extents: ('a -> int64 -> int64 -> flags -> extent list) ->
+  ?cache: ('a -> int64 -> int64 -> flags -> unit) ->
 
   (* Miscellaneous. *)
   ?dump_plugin: (unit -> unit) ->
diff --git a/plugins/ocaml/plugin.c b/plugins/ocaml/plugin.c
index b6964046..74550993 100644
--- a/plugins/ocaml/plugin.c
+++ b/plugins/ocaml/plugin.c
@@ -656,7 +656,7 @@ trim_wrapper (void *h, uint32_t count, uint64_t offset, uint32_t flags)
   CAMLlocal4 (rv, countv, offsetv, flagsv);
   LEAVE_BLOCKING_SECTION_FOR_CURRENT_SCOPE ();
 
-  countv = caml_copy_int32 (count);
+  countv = caml_copy_int64 (count);
   offsetv = caml_copy_int64 (offset);
   flagsv = Val_flags (flags);
 
@@ -677,7 +677,7 @@ zero_wrapper (void *h, uint32_t count, uint64_t offset, uint32_t flags)
   CAMLlocal4 (rv, countv, offsetv, flagsv);
   LEAVE_BLOCKING_SECTION_FOR_CURRENT_SCOPE ();
 
-  countv = caml_copy_int32 (count);
+  countv = caml_copy_int64 (count);
   offsetv = caml_copy_int64 (offset);
   flagsv = Val_flags (flags);
 
@@ -699,7 +699,7 @@ extents_wrapper (void *h, uint32_t count, uint64_t offset, uint32_t flags,
   CAMLlocal5 (rv, countv, offsetv, flagsv, v);
   LEAVE_BLOCKING_SECTION_FOR_CURRENT_SCOPE ();
 
-  countv = caml_copy_int32 (count);
+  countv = caml_copy_int64 (count);
   offsetv = caml_copy_int64 (offset);
   flagsv = Val_flags (flags);
 
@@ -739,7 +739,7 @@ cache_wrapper (void *h, uint32_t count, uint64_t offset, uint32_t flags)
   CAMLlocal4 (rv, countv, offsetv, flagsv);
   LEAVE_BLOCKING_SECTION_FOR_CURRENT_SCOPE ();
 
-  countv = caml_copy_int32 (count);
+  countv = caml_copy_int64 (count);
   offsetv = caml_copy_int64 (offset);
   flagsv = Val_flags (flags);
 
-- 
2.32.0




More information about the Libguestfs mailing list