From fa42c0dcb763519efa1530b015bb8232916d840e Mon Sep 17 00:00:00 2001 From: Zious Date: Tue, 7 Apr 2026 14:39:11 -0500 Subject: [PATCH 1/2] fix: return Duplicate when multi-segment union fully covers new segment The fully_covered check only tested single-segment coverage. When a new segment was covered by the union of multiple adjacent existing segments, gaps was empty but the return logic fell through to PartialOverlap. This inflated segments_inserted stats. Fixes #34. --- src/reassembly/segment.rs | 2 ++ tests/reassembly_segment_tests.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/reassembly/segment.rs b/src/reassembly/segment.rs index e8d3489..47d16fe 100644 --- a/src/reassembly/segment.rs +++ b/src/reassembly/segment.rs @@ -180,6 +180,8 @@ impl FlowDirection { // Only report ConflictingOverlap when fully covered (no gap was inserted) return if !had_gap && has_conflict { InsertResult::ConflictingOverlap + } else if !had_gap { + InsertResult::Duplicate } else if truncated { InsertResult::Truncated } else { diff --git a/tests/reassembly_segment_tests.rs b/tests/reassembly_segment_tests.rs index 88bf578..ea8bda8 100644 --- a/tests/reassembly_segment_tests.rs +++ b/tests/reassembly_segment_tests.rs @@ -288,3 +288,33 @@ fn test_out_of_window_segment_rejected() { let result = dir.insert_segment(edge_seq as u32, b"edge", 10_485_760, 10_000, 1_048_576); assert_eq!(result, InsertResult::Inserted); } + +#[test] +fn test_multi_segment_full_coverage_returns_duplicate() { + let mut dir = FlowDirection::new(); + dir.set_isn(1000); + + // Insert two adjacent segments: "AAA" at offset 1, "BBB" at offset 4 + dir.insert_segment(1001, b"AAA", 10_485_760, 10_000, 10_485_760); + dir.insert_segment(1004, b"BBB", 10_485_760, 10_000, 10_485_760); + + // Insert segment spanning both: "AAABBB" at offset 1 + // Union of existing segments fully covers this — should be Duplicate + let result = dir.insert_segment(1001, b"AAABBB", 10_485_760, 10_000, 10_485_760); + assert_eq!(result, InsertResult::Duplicate); +} + +#[test] +fn test_multi_segment_full_coverage_conflicting_returns_conflict() { + let mut dir = FlowDirection::new(); + dir.set_isn(1000); + + // Insert two adjacent segments: "AAA" at offset 1, "BBB" at offset 4 + dir.insert_segment(1001, b"AAA", 10_485_760, 10_000, 10_485_760); + dir.insert_segment(1004, b"BBB", 10_485_760, 10_000, 10_485_760); + + // Insert segment spanning both with different data + // Union covers it but data conflicts — should be ConflictingOverlap + let result = dir.insert_segment(1001, b"XXXXXX", 10_485_760, 10_000, 10_485_760); + assert_eq!(result, InsertResult::ConflictingOverlap); +} From 5d0af61f458cb26c3442a90310358ce8d83122da Mon Sep 17 00:00:00 2001 From: Zious Date: Tue, 7 Apr 2026 14:44:38 -0500 Subject: [PATCH 2/2] fix: update misleading comment on multi-segment overlap return logic --- src/reassembly/segment.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reassembly/segment.rs b/src/reassembly/segment.rs index 47d16fe..dafc9d7 100644 --- a/src/reassembly/segment.rs +++ b/src/reassembly/segment.rs @@ -177,7 +177,7 @@ impl FlowDirection { } } - // Only report ConflictingOverlap when fully covered (no gap was inserted) + // Union of existing segments covers the new segment entirely (no gaps to fill) return if !had_gap && has_conflict { InsertResult::ConflictingOverlap } else if !had_gap {