From c40382267432d741d9ef24aecdec55d1768ae448 Mon Sep 17 00:00:00 2001 From: Roman Arutyunyan Date: Tue, 25 Jan 2022 09:45:50 +0300 Subject: [PATCH] QUIC: fixed chain returned from ngx_quic_write_chain(). Previously, when input ended on a QUIC buffer boundary, input chain was not advanced to the next buffer. As a result, ngx_quic_write_chain() returned a chain with an empty buffer instead of NULL. This broke HTTP write filter, preventing it from closing the HTTP request and eventually timing out. Now input chain is always advanced to a buffer that has data, before checking QUIC buffer boundary condition. --- src/event/quic/ngx_event_quic_frames.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c index 851af4643..951b6e8a2 100644 --- a/src/event/quic/ngx_event_quic_frames.c +++ b/src/event/quic/ngx_event_quic_frames.c @@ -536,14 +536,16 @@ ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *in, continue; } - for (p = b->pos + offset; p != b->last && in; /* void */ ) { + p = b->pos + offset; + + while (in) { if (!ngx_buf_in_memory(in->buf) || in->buf->pos == in->buf->last) { in = in->next; continue; } - if (limit == 0) { + if (p == b->last || limit == 0) { break; }