diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1996-03-05 10:12:41 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1996-03-05 10:12:41 +0000 |
commit | 161d8a16d12a26920073ab37fcda9f7cbb333048 (patch) | |
tree | df0c867c2eee5023ea034f0a2e72c9016dc2fff9 /otherlibs/unix | |
parent | ee63e8d356b5717a32b0739fbe957f8e92d6e2c1 (diff) |
Verifications de bornes dans les fonctions read, write, send, recv.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@680 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/unix')
-rw-r--r-- | otherlibs/unix/unix.ml | 46 | ||||
-rw-r--r-- | otherlibs/unix/unix.mli | 16 |
2 files changed, 44 insertions, 18 deletions
diff --git a/otherlibs/unix/unix.ml b/otherlibs/unix/unix.ml index 033e4ea32..394daaac5 100644 --- a/otherlibs/unix/unix.ml +++ b/otherlibs/unix/unix.ml @@ -158,8 +158,18 @@ type file_perm = int external openfile : string -> open_flag list -> file_perm -> file_descr = "unix_open" external close : file_descr -> unit = "unix_close" -external read : file_descr -> string -> int -> int -> int = "unix_read" -external write : file_descr -> string -> int -> int -> int = "unix_write" +external unsafe_read : file_descr -> string -> int -> int -> int = "unix_read" +external unsafe_write : file_descr -> string -> int -> int -> int = "unix_write" + +let read fd buf ofs len = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.read" + else unsafe_read fd buf ofs len +let write fd buf ofs len = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.write" + else unsafe_write fd buf ofs len + external in_channel_of_descr : file_descr -> in_channel = "open_descriptor" external out_channel_of_descr : file_descr -> out_channel = "open_descriptor" external descr_of_in_channel : in_channel -> file_descr = "channel_descriptor" @@ -349,17 +359,37 @@ external listen : file_descr -> int -> unit = "unix_listen" external shutdown : file_descr -> shutdown_command -> unit = "unix_shutdown" external getsockname : file_descr -> sockaddr = "unix_getsockname" external getpeername : file_descr -> sockaddr = "unix_getpeername" -external recv : file_descr -> string -> int -> int -> msg_flag list -> int + +external unsafe_recv : + file_descr -> string -> int -> int -> msg_flag list -> int = "unix_recv" -external recvfrom : - file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr +external unsafe_recvfrom : + file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr = "unix_recvfrom" -external send : file_descr -> string -> int -> int -> msg_flag list -> int +external unsafe_send : + file_descr -> string -> int -> int -> msg_flag list -> int = "unix_send" -external sendto : - file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int +external unsafe_sendto : + file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int = "unix_sendto" "unix_sendto_native" +let recv fd buf ofs len flags = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.recv" + else unsafe_recv fd buf ofs len flags +let recvfrom fd buf ofs len flags = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.recvfrom" + else unsafe_recvfrom fd buf ofs len flags +let send fd buf ofs len flags = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.send" + else unsafe_send fd buf ofs len flags +let sendto fd buf ofs len flags addr = + if len < 0 or ofs + len >= String.length buf + then invalid_arg "Unix.sendto" + else unsafe_sendto fd buf ofs len flags addr + type host_entry = { h_name : string; h_aliases : string array; diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli index 19a318692..b54a93706 100644 --- a/otherlibs/unix/unix.mli +++ b/otherlibs/unix/unix.mli @@ -213,11 +213,11 @@ external openfile : string -> open_flag list -> file_perm -> file_descr a file descriptor on the named file. *) external close : file_descr -> unit = "unix_close" (* Close a file descriptor. *) -external read : file_descr -> string -> int -> int -> int = "unix_read" +val read : file_descr -> string -> int -> int -> int (* [read fd buff ofs len] reads [len] characters from descriptor [fd], storing them in string [buff], starting at position [ofs] in string [buff]. Return the number of characters actually read. *) -external write : file_descr -> string -> int -> int -> int = "unix_write" +val write : file_descr -> string -> int -> int -> int (* [write fd buff ofs len] writes [len] characters to descriptor [fd], taking them from string [buff], starting at position [ofs] in string [buff]. Return the number of characters actually @@ -656,17 +656,13 @@ external getsockname : file_descr -> sockaddr = "unix_getsockname" (* Return the address of the given socket. *) external getpeername : file_descr -> sockaddr = "unix_getpeername" (* Return the address of the host connected to the given socket. *) -external recv : file_descr -> string -> int -> int -> msg_flag list -> int - = "unix_recv" -external recvfrom : +val recv : file_descr -> string -> int -> int -> msg_flag list -> int +val recvfrom : file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr - = "unix_recvfrom" (* Receive data from an unconnected socket. *) -external send : file_descr -> string -> int -> int -> msg_flag list -> int - = "unix_send" -external sendto : +val send : file_descr -> string -> int -> int -> msg_flag list -> int +val sendto : file_descr -> string -> int -> int -> msg_flag list -> sockaddr -> int - = "unix_sendto" "unix_sendto_native" (* Send data over an unconnected socket. *) |