From c0add76d1005a82cbf19c9b41133d9a9c3caefc0 Mon Sep 17 00:00:00 2001 From: Zhidao HONG Date: Mon, 9 Sep 2024 23:15:29 +0800 Subject: [PATCH] http: Fix router process crash whilst using proxy When the client closes the connection before the upstream, the proxy's error handler was calling cleanup operation like peer close and requestclose twice, this fix ensures the cleanup is performed only once, improving proxy stability. Closes: https://github.com/nginx/unit/issues/828 --- src/nxt_h1proto.c | 5 +++++ src/nxt_http_proxy.c | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/nxt_h1proto.c b/src/nxt_h1proto.c index 5d1ed7904..48c2697bc 100644 --- a/src/nxt_h1proto.c +++ b/src/nxt_h1proto.c @@ -2869,6 +2869,11 @@ nxt_h1p_peer_body_process(nxt_task_t *task, nxt_http_peer_t *peer, } else if (h1p->remainder > 0) { length = nxt_buf_chain_length(out); h1p->remainder -= length; + + if (h1p->remainder == 0) { + nxt_buf_chain_add(&out, nxt_http_buf_last(peer->request)); + peer->closed = 1; + } } peer->body = out; diff --git a/src/nxt_http_proxy.c b/src/nxt_http_proxy.c index 6aa3aabb9..7f6ad6866 100644 --- a/src/nxt_http_proxy.c +++ b/src/nxt_http_proxy.c @@ -381,9 +381,10 @@ nxt_http_proxy_error(nxt_task_t *task, void *obj, void *data) r = obj; peer = r->peer; - nxt_http_proto[peer->protocol].peer_close(task, peer); - - nxt_mp_release(r->mem_pool); + if (!peer->closed) { + nxt_http_proto[peer->protocol].peer_close(task, peer); + nxt_mp_release(r->mem_pool); + } nxt_http_request_error(&r->task, r, peer->status); }