Skip to content

Commit 01228b1

Browse files
authored
Merge pull request wolfSSL#55 from danielinux/wrapping-in-sack-reordering
Use correct comparison in SACK reordering to avoid wrapping errors
2 parents 0307d9b + b491cf3 commit 01228b1

2 files changed

Lines changed: 37 additions & 3 deletions

File tree

src/test/unit/unit.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10237,6 +10237,21 @@ START_TEST(test_tcp_sort_sack_blocks_swaps_out_of_order)
1023710237
}
1023810238
END_TEST
1023910239

10240+
START_TEST(test_tcp_sort_sack_blocks_wrap_order)
10241+
{
10242+
struct tcp_sack_block blocks[2];
10243+
10244+
blocks[0].left = 0x00000010U;
10245+
blocks[0].right = 0x00000020U;
10246+
blocks[1].left = 0xFFFFFFF0U;
10247+
blocks[1].right = 0xFFFFFFF8U;
10248+
10249+
tcp_sort_sack_blocks(blocks, 2);
10250+
ck_assert_uint_eq(blocks[0].left, 0xFFFFFFF0U);
10251+
ck_assert_uint_eq(blocks[1].left, 0x00000010U);
10252+
}
10253+
END_TEST
10254+
1024010255
START_TEST(test_tcp_merge_sack_blocks_adjacent_and_disjoint)
1024110256
{
1024210257
struct tcp_sack_block blocks[3];
@@ -10255,6 +10270,23 @@ START_TEST(test_tcp_merge_sack_blocks_adjacent_and_disjoint)
1025510270
}
1025610271
END_TEST
1025710272

10273+
START_TEST(test_tcp_merge_sack_blocks_wrap_order)
10274+
{
10275+
struct tcp_sack_block blocks[2];
10276+
uint8_t merged;
10277+
10278+
blocks[0].left = 0x00000010U;
10279+
blocks[0].right = 0x00000020U;
10280+
blocks[1].left = 0xFFFFFFF0U;
10281+
blocks[1].right = 0xFFFFFFF8U;
10282+
10283+
merged = tcp_merge_sack_blocks(blocks, 2);
10284+
ck_assert_uint_eq(merged, 2U);
10285+
ck_assert_uint_eq(blocks[0].left, 0xFFFFFFF0U);
10286+
ck_assert_uint_eq(blocks[1].left, 0x00000010U);
10287+
}
10288+
END_TEST
10289+
1025810290
START_TEST(test_tcp_recv_tracks_holes_and_sack_blocks)
1025910291
{
1026010292
struct wolfIP s;
@@ -17393,7 +17425,9 @@ Suite *wolf_suite(void)
1739317425
tcase_add_test(tc_utils, test_tcp_build_ack_options_does_not_write_past_returned_len);
1739417426
tcase_add_test(tc_utils, test_tcp_build_ack_options_omits_ts_when_not_negotiated);
1739517427
tcase_add_test(tc_utils, test_tcp_sort_sack_blocks_swaps_out_of_order);
17428+
tcase_add_test(tc_utils, test_tcp_sort_sack_blocks_wrap_order);
1739617429
tcase_add_test(tc_utils, test_tcp_merge_sack_blocks_adjacent_and_disjoint);
17430+
tcase_add_test(tc_utils, test_tcp_merge_sack_blocks_wrap_order);
1739717431
tcase_add_test(tc_utils, test_tcp_recv_tracks_holes_and_sack_blocks);
1739817432
tcase_add_test(tc_utils, test_tcp_rebuild_rx_sack_right_edge_wraps);
1739917433
tcase_add_test(tc_utils, test_tcp_consume_ooo_wrap_trim_and_promote);

src/wolfip.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,7 +1887,7 @@ static void tcp_sort_sack_blocks(struct tcp_sack_block *blocks, uint8_t count)
18871887
/* Small fixed-size sort (n <= 4) to normalize interval order before merge. */
18881888
for (i = 0; i < count; i++) {
18891889
for (j = (uint8_t)(i + 1); j < count; j++) {
1890-
if (blocks[j].left < blocks[i].left) {
1890+
if (tcp_seq_lt(blocks[j].left, blocks[i].left)) {
18911891
struct tcp_sack_block tmp = blocks[i];
18921892
blocks[i] = blocks[j];
18931893
blocks[j] = tmp;
@@ -1907,8 +1907,8 @@ static uint8_t tcp_merge_sack_blocks(struct tcp_sack_block *blocks, uint8_t coun
19071907
* - gap: keep as separate ranges */
19081908
tcp_sort_sack_blocks(blocks, count);
19091909
for (i = 1; i < count; i++) {
1910-
if (blocks[i].left < blocks[out].right) {
1911-
if (blocks[i].right > blocks[out].right)
1910+
if (tcp_seq_lt(blocks[i].left, blocks[out].right)) {
1911+
if (!tcp_seq_leq(blocks[i].right, blocks[out].right))
19121912
blocks[out].right = blocks[i].right;
19131913
} else if (blocks[i].left == blocks[out].right) {
19141914
blocks[out].right = blocks[i].right;

0 commit comments

Comments
 (0)