Skip to content

Instantly share code, notes, and snippets.

@haesbaert
Created January 10, 2017 15:02
Show Gist options
  • Save haesbaert/4ca8f6a047009147f5caf93f019c8179 to your computer and use it in GitHub Desktop.
Save haesbaert/4ca8f6a047009147f5caf93f019c8179 to your computer and use it in GitHub Desktop.
let scan_pkt buf =
let open Usane in
let len = Cstruct.len buf in
let partial () =
if len < (1024 * 64) then
None
else
invalid_arg "Buffer is too big"
in
let wrap () =
(* Using pad_len as int32 saves us a lot of conversions. *)
let pkt_len = get_pkt_hdr_pkt_len buf in
let pad_len = Int32.of_int (get_pkt_hdr_pad_len buf) in
if pkt_len = Int32.zero || Uint32.(pkt_len >= max_pkt_len) then
invalid_arg "Bad pkt_len"
else if Uint32.(pad_len >= pkt_len) then
invalid_arg "Bad pad_len";
let buf = Cstruct.shift buf sizeof_pkt_hdr in
let len = Cstruct.len buf in
(* This is a partial packet, hold onto t *)
if Uint32.(pkt_len > (of_int len)) then
partial ()
else
let payload_len, u1 = Uint32.(sub pkt_len pad_len) in
let payload_len, u2 = Uint32.pred payload_len in
if u1 || u2 then
invalid_arg "Bad payload_len";
Some (Cstruct.set_len buf (Int32.to_int payload_len))
in
if len < 2 then
ok None
else
trap_exn wrap ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment