From a36b311b9f1eee33ac42b008858c1adc1763a791 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 13 Jun 2017 22:00:22 +0200 Subject: [PATCH] BUG/MINOR: buffers: Fix bi/bo_contig_space to handle full buffers These functions was added in commit 637f8f2c ("BUG/MEDIUM: buffers: Fix how input/output data are injected into buffers"). This patch fixes hidden bugs. When a buffer is full (buf->i + buf->o == buf->size), instead of returning 0, these functions can return buf->size. Today, this never happens because callers already check if the buffer is full before calling bi/bo_contig_space. But to avoid possible bugs if calling conditions changed, we slightly refactored these functions. --- include/common/buffer.h | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/include/common/buffer.h b/include/common/buffer.h index 040a26e2f..f8bd26efb 100644 --- a/include/common/buffer.h +++ b/include/common/buffer.h @@ -163,12 +163,16 @@ static inline int bi_contig_space(const struct buffer *b) { const char *left, *right; - left = bi_end(b); - right = bo_ptr(b); - - if (left >= right) - right = b->data + b->size; - + left = b->p + b->i; + right = b->p - b->o; + if (left >= b->data + b->size) + left -= b->size; + else { + if (right < b->data) + right += b->size; + else + right = b->data + b->size; + } return (right - left); } @@ -181,10 +185,11 @@ static inline int bo_contig_space(const struct buffer *b) { const char *left, *right; - left = bo_end(b); - right = bo_ptr(b); - - if (left >= right) + left = b->p; + right = b->p - b->o; + if (right < b->data) + right += b->size; + else right = b->data + b->size; return (right - left);