Skip to content

Commit 0307d9b

Browse files
authored
Merge pull request wolfSSL#54 from danielinux/fifo_no_space_off_by_one
Fix off-by-one comparison in space calculation
2 parents 338ec0f + 64dfbfc commit 0307d9b

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

src/test/unit/unit.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14220,6 +14220,45 @@ START_TEST(test_fifo_push_wrap_multiple) {
1422014220
}
1422114221
END_TEST
1422214222

14223+
START_TEST(test_fifo_push_wrap_tail_equals_needed)
14224+
{
14225+
struct fifo f;
14226+
uint8_t buffer[64];
14227+
uint8_t payload[8] = {0xAA, 0xBB, 0xCC, 0xDD, 0x11, 0x22, 0x33, 0x44};
14228+
uint32_t needed = (uint32_t)(sizeof(struct pkt_desc) + sizeof(payload));
14229+
struct pkt_desc *desc;
14230+
14231+
fifo_init(&f, buffer, sizeof(buffer));
14232+
f.head = 60;
14233+
f.tail = needed;
14234+
f.h_wrap = 0;
14235+
14236+
ck_assert_int_eq(fifo_push(&f, payload, sizeof(payload)), 0);
14237+
ck_assert_uint_eq(f.h_wrap, 60U);
14238+
ck_assert_uint_eq(f.head, needed);
14239+
14240+
desc = (struct pkt_desc *)buffer;
14241+
ck_assert_uint_eq(desc->pos, 0U);
14242+
ck_assert_uint_eq(desc->len, sizeof(payload));
14243+
}
14244+
END_TEST
14245+
14246+
START_TEST(test_fifo_can_push_len_wrap_tail_equals_needed)
14247+
{
14248+
struct fifo f;
14249+
uint8_t buffer[64];
14250+
uint32_t len = 8U;
14251+
uint32_t needed = (uint32_t)(sizeof(struct pkt_desc) + len);
14252+
14253+
fifo_init(&f, buffer, sizeof(buffer));
14254+
f.head = 60;
14255+
f.tail = needed;
14256+
f.h_wrap = 0;
14257+
14258+
ck_assert_int_eq(fifo_can_push_len(&f, len), 1);
14259+
}
14260+
END_TEST
14261+
1422314262
START_TEST(test_fifo_space_wrap_sets_hwrap)
1422414263
{
1422514264
struct fifo f;
@@ -16991,6 +17030,8 @@ Suite *wolf_suite(void)
1699117030
tcase_add_test(tc_core, test_fifo_can_push_len_head_at_wrap_boundary);
1699217031
tcase_add_test(tc_core, test_fifo_push_wrap);
1699317032
tcase_add_test(tc_core, test_fifo_push_wrap_multiple);
17033+
tcase_add_test(tc_core, test_fifo_push_wrap_tail_equals_needed);
17034+
tcase_add_test(tc_core, test_fifo_can_push_len_wrap_tail_equals_needed);
1699417035
tcase_add_test(tc_core, test_fifo_space_wrap_sets_hwrap);
1699517036
tcase_add_test(tc_core, test_fifo_space_wrap_returns_zero);
1699617037
tcase_add_test(tc_core, test_fifo_peek_wrap_to_start);

src/wolfip.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ static int fifo_push(struct fifo *f, void *data, uint32_t len)
338338
if (h_wrap == 0 && head >= tail) {
339339
uint32_t end_space = f->size - head;
340340
if (end_space < needed) {
341-
if (tail <= needed)
341+
if (tail < needed)
342342
return -1;
343343
h_wrap = head;
344344
head = 0;
@@ -410,7 +410,7 @@ static int fifo_can_push_len(const struct fifo *fin, uint32_t len)
410410
if (h_wrap == 0 && head >= tail) {
411411
uint32_t end_space = fin->size - head;
412412
if (end_space < needed) {
413-
if (tail <= needed)
413+
if (tail < needed)
414414
return 0;
415415
h_wrap = head;
416416
head = 0;

0 commit comments

Comments
 (0)