diff --git a/mip/mip.c b/mip/mip.c index 1b591076..7e340fe7 100644 --- a/mip/mip.c +++ b/mip/mip.c @@ -184,7 +184,7 @@ static void q_copyout(struct queue *q, uint8_t *buf, size_t len, size_t tail) { static bool q_write(struct queue *q, const void *buf, size_t len) { bool success = false; - size_t left = q->len - q->head + q->tail; + size_t left = (q->len - q->head + q->tail -1) % q->len; if (len + sizeof(size_t) <= left) { q_copyin(q, (uint8_t *) &len, sizeof(len), q->head); q_copyin(q, (uint8_t *) buf, len, (q->head + sizeof(size_t)) % q->len); diff --git a/mongoose.c b/mongoose.c index 916f0925..81738650 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6472,7 +6472,7 @@ static void q_copyout(struct queue *q, uint8_t *buf, size_t len, size_t tail) { static bool q_write(struct queue *q, const void *buf, size_t len) { bool success = false; - size_t left = q->len - q->head + q->tail; + size_t left = (q->len - q->head + q->tail -1) % q->len; if (len + sizeof(size_t) <= left) { q_copyin(q, (uint8_t *) &len, sizeof(len), q->head); q_copyin(q, (uint8_t *) buf, len, (q->head + sizeof(size_t)) % q->len); diff --git a/test/mip_test.c b/test/mip_test.c index 2de65eb3..3bb05940 100644 --- a/test/mip_test.c +++ b/test/mip_test.c @@ -2,15 +2,17 @@ #include "mongoose.c" static void test_queue(void) { - uint8_t buf[sizeof(size_t) + 5]; + static uint8_t buf[sizeof(size_t) + sizeof(uint16_t) + 3 ]; // fit 1 element but not 2 uint16_t val = 1234; - struct queue q = {buf, sizeof(buf), 0, 0}; + static struct queue q = {buf, sizeof(buf), 0, 0}; // Write to an empty queue, and read back assert(q_avail(&q) == 0); assert(q_write(&q, &val, sizeof(val)) == true); assert(q_avail(&q) == sizeof(val)); assert(q.head > q.tail); + // Only one element may fit + assert(q_write(&q, &val, sizeof(val)) == false); val = 0; assert(q_read(&q, &val) == sizeof(val)); assert(val == 1234); @@ -20,6 +22,8 @@ static void test_queue(void) { assert(q_write(&q, &val, sizeof(val)) == true); assert(q_avail(&q) == sizeof(val)); assert(q.head < q.tail); + // Only one element may fit + assert(q_write(&q, &val, sizeof(val)) == false); val = 0; assert(q_read(&q, &val) == sizeof(val)); assert(val == 1234);