summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2025-12-25 01:21:52 +0400
committerSergey Kandaurov <s.kandaurov@f5.com>2026-01-29 14:52:41 +0400
commit3afd85e4b5cbb0c49608b04e06ea7b5ef97b3308 (patch)
tree8951185a6ecd5299f08fe1b0d754a4b2e10988ea /src
parentcd12dc4f12489257e851654ec1883cf06fa0b095 (diff)
downloadnginx-3afd85e4b5cbb0c49608b04e06ea7b5ef97b3308.tar.gz
nginx-3afd85e4b5cbb0c49608b04e06ea7b5ef97b3308.tar.bz2
Output chain: clear the last_buf flag unless inherited.
For instance, the last_buf flag is used in the http proxy module when creating HTTP/2 requests to indicate the output is closed. The flag is inherited in ngx_output_chain() to a destination buffer when reading the buffered request body. Then it is used in the proxy output filter to mark the last HTTP/2 DATA frame with END_STREAM. The problem happens when reusing the destination buffer, such as to re-read the buffered request body on next upstream, because this buffer may contain a dirty last_buf value, which breaks sending HTTP/2 request body in multiple output filter calls. The flush and last_in_chain flags are cleared for consistency.
Diffstat (limited to 'src')
-rw-r--r--src/core/ngx_output_chain.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
index a46209c17..eb467e06a 100644
--- a/src/core/ngx_output_chain.c
+++ b/src/core/ngx_output_chain.c
@@ -552,6 +552,11 @@ ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)
dst->flush = src->flush;
dst->last_buf = src->last_buf;
dst->last_in_chain = src->last_in_chain;
+
+ } else {
+ dst->flush = 0;
+ dst->last_buf = 0;
+ dst->last_in_chain = 0;
}
} else {
@@ -648,6 +653,11 @@ ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)
dst->flush = src->flush;
dst->last_buf = src->last_buf;
dst->last_in_chain = src->last_in_chain;
+
+ } else {
+ dst->flush = 0;
+ dst->last_buf = 0;
+ dst->last_in_chain = 0;
}
}