Mercurial > prosody-hg
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++) { |
