|
commit a8fcdacb8cc0dddec72b1ddc4d9afc92d3684acd
|
|
Author: Willy Tarreau <w@1wt.eu>
|
|
Date: Fri Aug 2 07:48:47 2019 +0200
|
|
|
|
BUG/MEDIUM: mux-h2: unbreak receipt of large DATA frames
|
|
|
|
Recent optimization in commit 4d7a88482 ("MEDIUM: mux-h2: don't try to
|
|
read more than needed") broke the receipt of large DATA frames because
|
|
it would unconditionally subscribe if there was some room left, thus
|
|
preventing any new rx from being done since subscription may only be
|
|
done once the end was reached, as indicated by ret == 0.
|
|
|
|
However, fixing this uncovered that in HTX mode previous versions might
|
|
occasionally be affected as well, when an available frame is the same
|
|
size as the maximum data that may fit into an HTX buffer, we may end
|
|
up reading that whole frame and still subscribe since it's still allowed
|
|
to receive, thus causing issues to read the next frame.
|
|
|
|
This patch will only work for 2.1-dev but a minor adaptation will be
|
|
needed for earlier versions (down to 1.9, where subscribe() was added).
|
|
|
|
(cherry picked from commit 9bc1c95855b9c6300de5ecf3720cbe4b2558c5a1)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/src/mux_h2.c b/src/mux_h2.c
|
|
index 5bb85181..d605fe94 100644
|
|
--- a/src/mux_h2.c
|
|
+++ b/src/mux_h2.c
|
|
@@ -2766,7 +2766,7 @@ static int h2_recv(struct h2c *h2c)
|
|
ret = 0;
|
|
} while (ret > 0);
|
|
|
|
- if (h2_recv_allowed(h2c) && (b_data(buf) < buf->size))
|
|
+ if (max && !ret && h2_recv_allowed(h2c))
|
|
conn->xprt->subscribe(conn, conn->xprt_ctx, SUB_RETRY_RECV, &h2c->wait_event);
|
|
|
|
if (!b_data(buf)) {
|