From: Christopher Faulet Date: Tue, 13 Jun 2017 20:00:22 +0000 (+0200) Subject: BUG/MINOR: buffers: Fix bi/bo_contig_space to handle full buffers X-Git-Tag: v1.8-dev3~294 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a36b311b9f1eee33ac42b008858c1adc1763a791;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/common/buffer.h b/include/common/buffer.h index 040a26e2f0..f8bd26efbb 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);