Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

check the length of lists given in options before writing them #48

Merged
merged 3 commits into from Mar 29, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 15 additions & 9 deletions lib/dhcp_wire.ml
Expand Up @@ -773,16 +773,22 @@ let buf_of_options sbuf options =
blit_from_string s 0 buf 0 len;
shift buf len
in
let make_listf f len code l buf =
let make_listf ?(min_len=1) f len code l buf =
if (List.length l) < min_len then invalid_arg "Invalid option" else
let buf = put_code code buf |> put_len (len * (List.length l)) in
List.fold_left f buf l
in
let put_coded_8_list = make_listf (fun buf x -> put_8 x buf) 1 in
let put_coded_16_list = make_listf (fun buf x -> put_16 x buf) 2 in
let put_coded_8_list ?min_len =
make_listf ?min_len (fun buf x -> put_8 x buf) 1 in
let put_coded_16_list ?min_len =
make_listf ?min_len (fun buf x -> put_16 x buf) 2 in
(* let put_coded_32_list = make_listf (fun buf x -> put_32 x buf) 4 in *)
let put_coded_ip_list = make_listf (fun buf x -> put_ip x buf) 4 in
let put_coded_prefix_list = make_listf (fun buf x -> put_prefix x buf) 8 in
let put_coded_ip_tuple_list = make_listf (fun buf x -> put_ip_tuple x buf) 8 in
let put_coded_ip_list ?min_len =
make_listf ?min_len (fun buf x -> put_ip x buf) 4 in
let put_coded_prefix_list ?min_len =
make_listf ?min_len (fun buf x -> put_prefix x buf) 8 in
let put_coded_ip_tuple_list ?min_len =
make_listf ?min_len (fun buf x -> put_ip_tuple x buf) 8 in
let buf_of_option buf option =
match option with
| Pad -> buf (* we don't pad *) (* code 0 *)
Expand Down Expand Up @@ -842,7 +848,7 @@ let buf_of_options sbuf options =
| Server_identifier si -> put_coded_ip 54 si buf (* code 54 *)
| Parameter_requests pr ->
put_coded_8_list 55
(List.map option_code_to_int pr) buf (* code 55 *)
(List.map option_code_to_int pr) buf (* code 55 *)
| Message m -> put_coded_bytes 56 m buf (* code 56 *)
| Max_message mm -> put_coded_16 57 mm buf (* code 57 *)
| Renewal_t1 rt -> put_coded_32 58 rt buf (* code 58 *)
Expand All @@ -855,7 +861,7 @@ let buf_of_options sbuf options =
| Nis_plus_servers ips -> put_coded_ip_list 65 ips buf (* code 65 *)
| Tftp_server_name tsn -> put_coded_bytes 66 tsn buf (* code 66 *)
| Bootfile_name bn -> put_coded_bytes 67 bn buf (* code 67 *)
| Mobile_ip_home_agent ips -> put_coded_ip_list 68 ips buf(* code 68 *)
| Mobile_ip_home_agent ips -> put_coded_ip_list ~min_len:0 68 ips buf (* code 68 *)
| Smtp_servers ips -> put_coded_ip_list 69 ips buf (* code 69 *)
| Pop3_servers ips -> put_coded_ip_list 70 ips buf (* code 70 *)
| Nntp_servers ips -> put_coded_ip_list 71 ips buf (* code 71 *)
Expand All @@ -875,7 +881,7 @@ let buf_of_options sbuf options =
| Nds_tree_name nn -> put_coded_bytes 86 nn buf (* code 86 *)
| Nds_context nc -> put_coded_bytes 87 nc buf (* code 87 *)
| Bcmcs_controller_domain_name_list l -> put_coded_bytes 88 l buf (* code 88 *)
| Bcmcs_controller_ipv4_addrs l -> put_coded_ip_list 98 l buf (* code 89 *)
| Bcmcs_controller_ipv4_addrs l -> put_coded_ip_list 89 l buf (* code 89 *)
| Authentication a -> put_coded_bytes 90 a buf (* code 90 *)
| Client_last_transaction_time t -> put_coded_32 91 t buf (* code 91 *)
| Associated_ips l -> put_coded_ip_list 92 l buf (* code 92 *)
Expand Down