Skip to content

Commit 52f2068

Browse files
committed
more tests and fixes
1 parent bc68c0b commit 52f2068

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

src/state.ml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,17 @@ module Reassembly_queue = struct
101101
(* 2 - the current "e" may be merged into the head of acc *)
102102
let acc' = match acc with [] -> [] | _hd :: tl -> tl in
103103
if Sequence.less_equal e.seq seq_end then
104-
let to_cut = Sequence.sub seq_end e.seq in
105-
if to_cut = 0 then
104+
let overlap = Sequence.sub seq_end e.seq in
105+
if overlap = 0 then
106106
(* to_cut = 0, we can just merge them *)
107107
let elt = { elt with fin = e.fin || elt.fin ; data = e.data @ elt.data } in
108108
Some (elt, Sequence.addi elt.seq (Cstruct.lenv elt.data)), elt :: acc'
109109
else
110-
(* we need to cut some bytes from the current hd *)
111-
match elt.data with
112-
| head :: tl ->
113-
let hd = Cstruct.sub head 0 (Cstruct.length head - to_cut) in
114-
let data = e.data @ hd :: tl in
115-
let elt = { elt with fin = e.fin || elt.fin ; data } in
116-
Some (elt, Sequence.addi elt.seq (Cstruct.lenv data)), elt :: acc'
117-
| [] -> (inserted, e :: acc)
110+
(* we need to cut some bytes from e *)
111+
let data = List.rev (Cstruct.shiftv (List.rev e.data) overlap) in
112+
let data = data @ elt.data in
113+
let elt = { elt with fin = e.fin || elt.fin ; data } in
114+
Some (elt, Sequence.addi elt.seq (Cstruct.lenv data)), elt :: acc'
118115
else
119116
(* there's still a hole, nothing to merge *)
120117
(inserted, e :: acc)

test/reassembly.ml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,42 @@ let overlap_3 () =
245245
| Some (s, _) -> Alcotest.(check string "data is good" "CCCCCCCCCCBBBBBBAAAAAAAA"
246246
(Cstruct.to_string s))
247247

248+
let overlap_4 () =
249+
let r = insert_seg empty (Sequence.of_int32 16l, false, Cstruct.of_string "AAAAAAAA") in
250+
let r = insert_seg r (Sequence.of_int32 8l, false, Cstruct.of_string "BBBBBB") in
251+
let r = insert_seg r (Sequence.of_int32 6l, false, Cstruct.of_string "CCCCCCCCCCCCCCCC") in
252+
let r = insert_seg r (Sequence.of_int32 0l, false, Cstruct.of_string "DDDDDDDD") in
253+
let r', s = maybe_take r Sequence.zero in
254+
Alcotest.(check int "reassembly queue is now empty" 0 (length r'));
255+
match s with
256+
| None -> Alcotest.fail "should be some data"
257+
| Some (s, _) -> Alcotest.(check string "data is good" "DDDDDDDDCCCCCCCCCCCCCCAA"
258+
(Cstruct.to_string s))
259+
260+
let overlap_5 () =
261+
let r = insert_seg empty (Sequence.of_int32 0l, false, Cstruct.of_string "AAAAAAAAAAAAAAAA") in
262+
let r = insert_seg r (Sequence.of_int32 4l, false, Cstruct.of_string "BBBBBB") in
263+
let r = insert_seg r (Sequence.of_int32 10l, false, Cstruct.of_string "CCCCCC") in
264+
let r = insert_seg r (Sequence.of_int32 12l, false, Cstruct.of_string "DDDDDD") in
265+
let r = insert_seg r (Sequence.of_int32 14l, false, Cstruct.of_string "EE") in
266+
let r', s = maybe_take r Sequence.zero in
267+
Alcotest.(check int "reassembly queue is now empty" 0 (length r'));
268+
match s with
269+
| None -> Alcotest.fail "should be some data"
270+
| Some (s, _) -> Alcotest.(check string "data is good" "AAAABBBBBBCCDDEEDD"
271+
(Cstruct.to_string s))
272+
273+
let overlap_6 () =
274+
let r = insert_seg empty (Sequence.of_int32 0l, false, Cstruct.of_string "AAAAAAAA") in
275+
let r = insert_seg r (Sequence.of_int32 10l, false, Cstruct.of_string "BBBBBB") in
276+
let r = insert_seg r (Sequence.of_int32 8l, false, Cstruct.of_string "DDDD") in
277+
let r', s = maybe_take r Sequence.zero in
278+
Alcotest.(check int "reassembly queue is now empty" 0 (length r'));
279+
match s with
280+
| None -> Alcotest.fail "should be some data"
281+
| Some (s, _) -> Alcotest.(check string "data is good" "AAAAAAAADDDDBBBB"
282+
(Cstruct.to_string s))
283+
248284
let regr_187 () =
249285
let r = insert_seg empty (Sequence.of_int32 16l, false, Cstruct.of_string "000002om") in
250286
let r = insert_seg r (Sequence.of_int32 8l, false, Cstruct.of_string "001001nn001002nm001003nl") in
@@ -286,6 +322,9 @@ let tests = [
286322
"overlap 1", `Quick, overlap_1 ;
287323
"overlap 2", `Quick, overlap_2 ;
288324
"overlap 3", `Quick, overlap_3 ;
325+
"overlap 4", `Quick, overlap_4 ;
326+
"overlap 5", `Quick, overlap_5 ;
327+
"overlap 6", `Quick, overlap_6 ;
289328
"regression 187", `Quick, regr_187 ;
290329
"regression 188", `Quick, regr_188 ;
291330
]

0 commit comments

Comments
 (0)