comparison util-src/ringbuffer.c @ 14177:67b68147ed1d 13.0

util.ringbuffer: find(): Fix find logic bugs If the buffer was full, find() would return earlier (wpos == rpos). Checking blen is the better way to test if the buffer is empty. Secondly, the loop scanned for blen - l, but if l (length of needle) was larger than the buffer length, this calculation would underflow and cause a lot of spinning. New tests have been added to cover various edge cases of :find().
author Matthew Wild <mwild1@gmail.com>
date Mon, 25 May 2026 14:44:20 +0100
parents 2bcabbeac9b0
children
comparison
equal deleted inserted replaced
14176:2bcabbeac9b0 14177:67b68147ed1d
80 80
81 static int find(ringbuffer *b, const char *s, size_t l) { 81 static int find(ringbuffer *b, const char *s, size_t l) {
82 size_t i, j; 82 size_t i, j;
83 int m; 83 int m;
84 84
85 if(b->rpos == b->wpos) { /* empty */ 85 if(l > b->blen || l == 0) { /* needle is too large or too small */
86 return 0; 86 return 0;
87 } 87 }
88 88
89 /* look for a matching first byte */ 89 /* look for a matching first byte */
90 for(i = 0; i <= b->blen - l; i++) { 90 for(i = 0; i <= b->blen - l; i++) {