mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-31 10:31:46 +00:00
637f8f2ca7
The function buffer_contig_space is buggy and could lead to pernicious bugs (never hitted until now, AFAIK). This function should return the number of bytes that can be written into the buffer at once (without wrapping). First, this function is used to inject input data (bi_putblk) and to inject output data (bo_putblk and bo_inject). But there is no context. So it cannot decide where contiguous space should placed. For input data, it should be after bi_end(buf) (ie, buf->p + buf->i modulo wrapping calculation). For output data, it should be after bo_end(buf) (ie, buf->p) and input data are assumed to not exist (else there is no space at all). Then, considering we need to inject input data, this function does not always returns the right value. And when we need to inject output data, we must be sure to have no input data at all (buf->i == 0), else the result can also be wrong (but this is the caller responsibility, so everything should be fine here). The buffer can be in 3 different states: 1) no wrapping <---- o ----><----- i -----> +------------+------------+-------------+------------+ | |oooooooooooo|iiiiiiiiiiiii|xxxxxxxxxxxx| +------------+------------+-------------+------------+ ^ <contig_space> p ^ ^ l r 2) input wrapping ...---> <---- o ----><-------- i -------... +-----+------------+------------+--------------------+ |iiiii|xxxxxxxxxxxx|oooooooooooo|iiiiiiiiiiiiiiiiiiii| +-----+------------+------------+--------------------+ <contig_space> ^ ^ ^ p l r 3) output wrapping ...------ o ------><----- i -----> <----... +------------------+-------------+------------+------+ |oooooooooooooooooo|iiiiiiiiiiiii|xxxxxxxxxxxx|oooooo| +------------------+-------------+------------+------+ ^ <contig_space> p ^ ^ l r buffer_contig_space returns (l - r). The cases 1 and 3 are correctly handled. But for the second case, r is wrong. It points on the buffer's end (buf->data + buf->size). It should be bo_end(buf) (ie, buf->p - buf->o). To fix the bug, the function has been splitted. Now, bi_contig_space and bo_contig_space should be used to know the contiguous space available to insert, respectively, input data and output data. For bo_contig_space, input data are assumed to not exist. And the right version is used, depending what we want to do. In addition, to clarify the buffer's API, buffer_realign does not return value anymore. So it has the same API than buffer_slow_realign. This patch can be backported in 1.7, 1.6 and 1.5. |
||
---|---|---|
.. | ||
common | ||
import | ||
proto | ||
types |