diff --git a/lib/ringbuf.c b/lib/ringbuf.c index d4efbe05fb..11db502a94 100644 --- a/lib/ringbuf.c +++ b/lib/ringbuf.c @@ -58,7 +58,7 @@ size_t ringbuf_put(struct ringbuf *buf, const void *data, size_t size) size_t space = ringbuf_space(buf); size_t copysize = MIN(size, space); size_t tocopy = copysize; - if (tocopy > buf->size - buf->end) { + if (tocopy >= buf->size - buf->end) { size_t ts = buf->size - buf->end; memcpy(buf->data + buf->end, dp, ts); buf->end = 0; @@ -102,7 +102,7 @@ size_t ringbuf_peek(struct ringbuf *buf, size_t offset, void *data, size_t size) if (tocopy >= buf->size - cstart) { size_t ts = buf->size - cstart; memcpy(dp, buf->data + cstart, ts); - buf->start = cstart = 0; + cstart = 0; tocopy -= ts; dp += ts; } @@ -115,8 +115,9 @@ size_t ringbuf_copy(struct ringbuf *to, struct ringbuf *from, size_t size) size_t tocopy = MIN(ringbuf_space(to), size); uint8_t *cbuf = XCALLOC(MTYPE_TMP, tocopy); tocopy = ringbuf_peek(from, 0, cbuf, tocopy); + size_t put = ringbuf_put(to, cbuf, tocopy); XFREE(MTYPE_TMP, cbuf); - return ringbuf_put(to, cbuf, tocopy); + return put; } void ringbuf_reset(struct ringbuf *buf) @@ -129,5 +130,4 @@ void ringbuf_wipe(struct ringbuf *buf) { memset(buf->data, 0x00, buf->size); ringbuf_reset(buf); - buf->empty = true; } diff --git a/tests/lib/test_ringbuf.c b/tests/lib/test_ringbuf.c index c2f4f76a6f..7ba5a29b62 100644 --- a/tests/lib/test_ringbuf.c +++ b/tests/lib/test_ringbuf.c @@ -65,7 +65,7 @@ int main(int argc, char **argv) validate_state(soil, BUFSIZ, BUFSIZ); assert(soil->start == 0); - assert(soil->end == BUFSIZ); + assert(soil->end == 0); /* read 15 bytes of garbage */ printf("Validating read...\n"); @@ -73,7 +73,7 @@ int main(int argc, char **argv) validate_state(soil, BUFSIZ, BUFSIZ - 15); assert(soil->start == 15); - assert(soil->end == BUFSIZ); + assert(soil->end == 0); /* put another 10 bytes and validate wraparound */ printf("Validating wraparound...\n");