[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/2] make xen ocaml safe-strings compliant



The problem with the old patch is illustrated by the following section from the old patch for tools/ocaml/xenstored/utils.ml
@@ -85,7 +85,7 @@ let create_unix_socket name =
 let read_file_single_integer filename =
        let fd = Unix.openfile filename [ Unix.O_RDONLY ] 0o640 in
        let buf = String.make 20 (char_of_int 0) in
-       let sz = Unix.read fd buf 0 20 in
+       let sz = Unix.read fd (Bytes.of_string buf) 0 20 in
        Unix.close fd;
        int_of_string (String.sub buf 0 sz)

where the patch makes Unix.read write to a Bytes copy of buf and buf itself is unchanged, so int_of_string sees a string of null characters rather than a string to convert into a number.

Good analysis. (Bytes.of_string buf) created a buffer for the result from read() for which we have no handle.

Reviewing the new patch I believe it is sound. The (new) signature of read_mmap is

val read_mmap : backend_mmap -> 'a -> bytes -> int -> int

The new implementation is below - argument s used to be a string value and is now a bytes value. I would suggest to reflect this in the names (using b instead of s) as this is about conversion between strings and bytes.
  let read_mmap back con s len =
-       let rd = Xs_ring.read back.mmap s len in
+       let stmp = String.make len (char_of_int 0) in
+       let rd = Xs_ring.read back.mmap stmp len in
+       Bytes.blit_string stmp 0 s 0 rd;
        back.work_again <- (rd > 0);
        if rd > 0 then
                back.eventchn_notify ();

Below are the functions that changed their type and where this also should be considered:
-val read_fd : backend_fd -> 'a -> string -> int -> int
-val read_mmap : backend_mmap -> 'a -> string -> int -> int
-val read : t -> string -> int -> int
-val write_fd : backend_fd -> 'a -> string -> int -> int
+val read_fd : backend_fd -> 'a -> bytes -> int -> int
+val read_mmap : backend_mmap -> 'a -> bytes -> int -> int
+val read : t -> bytes -> int -> int
+val write_fd : backend_fd -> 'a -> bytes -> int -> int

-- Christian


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.