mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 15:17:01 +02:00
BUG/MEDIUM: mux-h1: Don't request more room on partial trailers
The commit 744451c7c
("BUG/MEDIUM: mux-h1: Properly detect full buffer cases
during message parsing") introduced a regression if trailers are not
received in one time. Indeed, in this case, nothing is appended in the
channel buffer, while there are some data in the input buffer. In this case,
we must not request more room to the upper layer, especially because the
channel buffer can be empty.
To fix the issue, on trailers parsing, we consider the H1 stream as
congested when the max size allowed is reached. Of course, the H1 stream is
also considered as congested if the trailers are too big and the channel
buffer is not empty.
This patch should fix the issue #1657. It must be backported as far as 2.0.
This commit is contained in:
parent
cea05437c0
commit
ae660be547
@ -878,8 +878,14 @@ int h1_parse_msg_tlrs(struct h1m *h1m, struct htx *dsthtx,
|
|||||||
struct h1m tlr_h1m;
|
struct h1m tlr_h1m;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!max || !b_data(srcbuf))
|
if (b_data(srcbuf) == ofs) {
|
||||||
|
/* Nothing to parse */
|
||||||
goto end;
|
goto end;
|
||||||
|
}
|
||||||
|
if (!max) {
|
||||||
|
/* No more room */
|
||||||
|
goto output_full;
|
||||||
|
}
|
||||||
|
|
||||||
/* Realing input buffer if necessary */
|
/* Realing input buffer if necessary */
|
||||||
if (b_peek(srcbuf, ofs) > b_tail(srcbuf))
|
if (b_peek(srcbuf, ofs) > b_tail(srcbuf))
|
||||||
|
@ -1709,7 +1709,7 @@ static size_t h1_handle_trailers(struct h1s *h1s, struct h1m *h1m, struct htx *h
|
|||||||
TRACE_ERROR("parsing error, reject H1 message", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_ERR, h1s->h1c->conn, h1s);
|
TRACE_ERROR("parsing error, reject H1 message", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_ERR, h1s->h1c->conn, h1s);
|
||||||
h1_capture_bad_message(h1s->h1c, h1s, h1m, buf);
|
h1_capture_bad_message(h1s->h1c, h1s, h1m, buf);
|
||||||
}
|
}
|
||||||
else if (ret == -2 || b_data(buf) != *ofs) {
|
else if (ret == -2) {
|
||||||
TRACE_STATE("RX path congested, waiting for more space", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_BLK, h1s->h1c->conn, h1s);
|
TRACE_STATE("RX path congested, waiting for more space", H1_EV_RX_DATA|H1_EV_RX_TLRS|H1_EV_H1S_BLK, h1s->h1c->conn, h1s);
|
||||||
h1s->flags |= H1S_F_RX_CONGESTED;
|
h1s->flags |= H1S_F_RX_CONGESTED;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user