Skip to content

Commit

Permalink
tools/ocaml: libxb: Avoid to use String_val() when value is bytes
Browse files Browse the repository at this point in the history
Commit ec7d54d "ocaml/libs/xb: Use bytes in place of strings for
mutable buffers" switch mutable buffers from string to bytes. However
the C code were still using String_Val() to access them.

While the underlying structure is the same between string and bytes, a
string is meant to be immutable. OCaml 4.06.1 and later will enforce it.
Therefore, it will not be possible to build the OCaml libs when using
-safe-string. This is because String_val() will return a const value.

To avoid plain cast in the code, the code is now switched to use
Bytes_val(). As the macro is not defined in older OCaml version, we need
to provide a stub.

Take the opportunity to switch to const the buffer in
ml_interface_write() as it should not be modified.

Reported-by: Dario Faggioli <[email protected]>
Signed-off-by: Julien Grall <[email protected]>
Acked-by: Christian Lindig <[email protected]>
  • Loading branch information
Julien Grall committed Apr 20, 2020
1 parent d92ba1a commit 7868643
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions tools/ocaml/libs/xb/xs_ring_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@

#define GET_C_STRUCT(a) ((struct mmap_interface *) a)

/*
* Bytes_val has been introduced by Ocaml 4.06.1. So define our own version
* if needed.
*/
#ifndef Bytes_val
#define Bytes_val(x) ((unsigned char *) Bp_val(x))
#endif

CAMLprim value ml_interface_read(value ml_interface,
value ml_buffer,
value ml_len)
Expand All @@ -44,7 +52,7 @@ CAMLprim value ml_interface_read(value ml_interface,
CAMLlocal1(ml_result);

struct mmap_interface *interface = GET_C_STRUCT(ml_interface);
char *buffer = String_val(ml_buffer);
unsigned char *buffer = Bytes_val(ml_buffer);
int len = Int_val(ml_len);
int result;

Expand Down Expand Up @@ -103,7 +111,7 @@ CAMLprim value ml_interface_write(value ml_interface,
CAMLlocal1(ml_result);

struct mmap_interface *interface = GET_C_STRUCT(ml_interface);
char *buffer = String_val(ml_buffer);
const unsigned char *buffer = Bytes_val(ml_buffer);
int len = Int_val(ml_len);
int result;

Expand Down

0 comments on commit 7868643

Please sign in to comment.