Skip to content

Commit 3907dbd

Browse files
committed
Correctly handle buckets between other buckets that don't touch
1 parent 1f86970 commit 3907dbd

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

src/internal.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9854,22 +9854,25 @@ int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte ty
98549854
msg->fragBucketListCount++;
98559855
}
98569856
}
9857-
else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
9858-
/* This is the new first fragment we have received */
9857+
else if (fragOffsetEnd < cur->m.m.offset) {
9858+
/* Fragment is entirely before cur with a gap */
9859+
DtlsFragBucket** prev_next;
98599860
if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
98609861
WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
98619862
return DTLS_TOO_MANY_FRAGMENTS_E;
98629863
}
9863-
msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
9864+
prev_next = prev != NULL
9865+
? &prev->m.m.next : &msg->fragBucketList;
9866+
*prev_next = DtlsMsgCreateFragBucket(fragOffset, data,
98649867
fragSz, heap);
9865-
if (msg->fragBucketList != NULL) {
9866-
msg->fragBucketList->m.m.next = cur;
9868+
if (*prev_next != NULL) {
9869+
(*prev_next)->m.m.next = cur;
98679870
msg->bytesReceived += fragSz;
98689871
msg->fragBucketListCount++;
98699872
}
98709873
else {
98719874
/* reset on error */
9872-
msg->fragBucketList = cur;
9875+
*prev_next = cur;
98739876
}
98749877
}
98759878
else {

tests/api.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28718,6 +28718,13 @@ static int test_wolfSSL_DTLS_fragment_buckets(void)
2871828718
EXPECT_TEST(DFB_TEST(ssl,10, 100, 0, 40, 1, 0, 50)); /* 0-40 */
2871928719
EXPECT_TEST(DFB_TEST(ssl,10, 100, 50, 50, 0, 1, 100)); /* 10-35 */
2872028720

28721+
/* Test region between other regions */
28722+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 0, 20, 1, 0, 20)); /* 0-20 */
28723+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 80, 20, 2, 0, 40)); /* 80-100 */
28724+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 40, 20, 3, 0, 60)); /* 40-60 */
28725+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 20, 20, 2, 0, 80)); /* 20-40 */
28726+
EXPECT_TEST(DFB_TEST(ssl,11, 100, 60, 20, 0, 1, 100)); /* 60-80 */
28727+
2872128728
DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
2872228729
ssl->dtls_rx_msg_list = NULL;
2872328730
ssl->dtls_rx_msg_list_sz = 0;

0 commit comments

Comments
 (0)