From 6f1916b6b2f441d3ff4ce8e4057c70f3e3bc2ec6 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 5 Jun 2026 12:25:46 +0300 Subject: [PATCH] =?UTF-8?q?tcp=5Fproxy=5Fclient:=20tcp=5Fclose=E2=86=92tcp?= =?UTF-8?q?=5Fabort,=20fix=20tw=5Fpcbs=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При CLOSE и FIN от сервера в обратном порядке (FIN relay + CLOSE от двух FIN), клиент сначала обрабатывает CLOSE (tcp_close → TIME_WAIT), потом FIN (tcp_shutdown на TIME_WAIT pcb), что портит tw_pcbs список — pcb->next замыкается на себя, lwip_tcp_input зависает в бесконечном цикле. tcp_abort шлёт RST и удаляет pcb сразу, без TIME_WAIT. --- src/proxy/tcp_proxy_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proxy/tcp_proxy_client.c b/src/proxy/tcp_proxy_client.c index 472c38e5..d47c4409 100644 --- a/src/proxy/tcp_proxy_client.c +++ b/src/proxy/tcp_proxy_client.c @@ -454,7 +454,7 @@ static void tcp_proxy_client_handle_close(struct tcp_proxy_client* p, uint32_t s pc->rem_closed = 1; if (pc->tx_buf) { u_free(pc->tx_buf); pc->tx_buf = NULL; pc->tx_len = 0; } etcp_router_waiter_cancel(pc->proxy->inst, pc->proxy->via_node_id, &pc->tx_waiter); - if (pc->pcb) { tcp_arg(pc->pcb, NULL); tcp_close(pc->pcb); pc->pcb = NULL; } + if (pc->pcb) { tcp_arg(pc->pcb, NULL); tcp_abort(pc->pcb); pc->pcb = NULL; } tcp_proxy_client_conn_free(pc); }