diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cbuf.c | 4 | ||||
-rw-r--r-- | src/cbuf.h | 8 |
2 files changed, 10 insertions, 2 deletions
@@ -143,13 +143,13 @@ cbuf_write(struct cbuf *cbuf, size_t index, const void *buf, size_t size) uint8_t *start, *end, *buf_end; size_t new_end, skip; - if (!cbuf_index_valid(cbuf, index)) { + if (!cbuf_range_valid(cbuf, index, cbuf->end)) { return EINVAL; } new_end = index + size; - if (!cbuf_index_valid(cbuf, new_end)) { + if (!cbuf_range_valid(cbuf, cbuf->start, new_end)) { cbuf->end = new_end; cbuf_update_start(cbuf); @@ -89,6 +89,14 @@ cbuf_index_valid(const struct cbuf *cbuf, size_t index) && ((cbuf->end - index) <= cbuf_size(cbuf)); } +static inline bool +cbuf_range_valid(const struct cbuf *cbuf, size_t start, size_t end) +{ + return (((end - start) <= cbuf_size(cbuf)) + && ((start - cbuf->start) <= cbuf_size(cbuf)) + && ((cbuf->end - end) <= cbuf_size(cbuf))); +} + /* * Initialize a circular buffer. * |