summaryrefslogtreecommitdiffstats
path: root/otherlibs/unix
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1996-03-05 10:12:41 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1996-03-05 10:12:41 +0000
commit161d8a16d12a26920073ab37fcda9f7cbb333048 (patch)
treedf0c867c2eee5023ea034f0a2e72c9016dc2fff9 /otherlibs/unix
parentee63e8d356b5717a32b0739fbe957f8e92d6e2c1 (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.ml46
-rw-r--r--otherlibs/unix/unix.mli16
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. *)