mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
BUG/MEDIUM: channel: don't allow to overwrite the reserve until connected
Commit 9c06ee4
("BUG/MEDIUM: channel: don't schedule data in transit for
leaving until connected") took care of an issue involving POST in conjunction
with http-send-name-header, where we absolutely never want to touch the
reserve until we're sure not to touch the buffer contents anymore, which
is indicated by the output stream-interface being connected.
But channel_may_recv() was not equipped with such a test, so in some
situations it might decide that it is possible to poll for reads, and
later channel_recv_limit() will decide it's not possible to read,
causing a loop. So we must add a similar test there.
Since the fix above was backported to 1.6 and 1.5, this fix must as well.
This commit is contained in:
parent
c3fe5330be
commit
4b46a3e8cc
@ -165,7 +165,9 @@ static inline int channel_may_send(const struct channel *chn)
|
|||||||
* end of transfer is close to happen. Note that both ->buf->o and ->to_forward
|
* end of transfer is close to happen. Note that both ->buf->o and ->to_forward
|
||||||
* are considered as available since they're supposed to leave the buffer. The
|
* are considered as available since they're supposed to leave the buffer. The
|
||||||
* test is optimized to avoid as many operations as possible for the fast case
|
* test is optimized to avoid as many operations as possible for the fast case
|
||||||
* and to be used as an "if" condition.
|
* and to be used as an "if" condition. Just like channel_recv_limit(), we
|
||||||
|
* never allow to overwrite the reserve until the output stream interface is
|
||||||
|
* connected, otherwise we could spin on a POST with http-send-name-header.
|
||||||
*/
|
*/
|
||||||
static inline int channel_may_recv(const struct channel *chn)
|
static inline int channel_may_recv(const struct channel *chn)
|
||||||
{
|
{
|
||||||
@ -179,6 +181,9 @@ static inline int channel_may_recv(const struct channel *chn)
|
|||||||
if (!rem)
|
if (!rem)
|
||||||
return 0; /* buffer already full */
|
return 0; /* buffer already full */
|
||||||
|
|
||||||
|
if (rem <= global.tune.maxrewrite && !channel_may_send(chn))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* now we know there's some room left, verify if we're touching
|
/* now we know there's some room left, verify if we're touching
|
||||||
* the reserve with some permanent input data.
|
* the reserve with some permanent input data.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user