From 483bf440fb41a0a581c56318d27b92a16bc7e584 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 5 Jun 2026 12:45:51 +0300 Subject: [PATCH] tcp_proxy_client: skip tcp_shutdown on TIME_WAIT/CLOSED pcb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit handle_fin вызывает tcp_shutdown(pcb,0,1) на любом PCB, включая TIME_WAIT. При active close (FIN_WAIT_1→FIN_WAIT_2→TIME_WAIT) PCB уже в tw_pcbs, tcp_shutdown на нём портит состояние → tw_pcbs зацикливается → lwip_tcp_input зависает. Проверка state != TIME_WAIT && != CLOSED перед вызовом. --- src/proxy/tcp_proxy_client.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/proxy/tcp_proxy_client.c b/src/proxy/tcp_proxy_client.c index d47c4409..17ce289e 100644 --- a/src/proxy/tcp_proxy_client.c +++ b/src/proxy/tcp_proxy_client.c @@ -470,7 +470,8 @@ static void tcp_proxy_client_handle_fin(struct tcp_proxy_client* p, uint32_t str if (!pc || !pc->pcb) return; DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "PROXY FIN FROM exit sid=%08x — shutdown read", stream_id); pc->fin_remote = 1; - tcp_shutdown(pc->pcb, 0, 1); + if (pc->pcb->state != TIME_WAIT && pc->pcb->state != CLOSED) + tcp_shutdown(pc->pcb, 0, 1); if (pc->fin_local && !pc->close_sent && !pc->close_pending) tcp_proxy_client_send_close(pc); }