From 80e4e4fd5dbceddd7675620291fc9dc060fa0517 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 30 May 2026 23:24:37 +0300 Subject: [PATCH] fix RST on FIN: tcp_recved in proxy_recv_cb BEFORE closing_tun, guard proxy_err_cb with !closing_sent --- src/tcp_proxy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tcp_proxy.c b/src/tcp_proxy.c index 599d09bf..957f925f 100644 --- a/src/tcp_proxy.c +++ b/src/tcp_proxy.c @@ -262,6 +262,8 @@ static err_t proxy_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t if (p == NULL || err != LERR_OK) { DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "PROXY FIN stream=%016llx tun=1 active=%d", (unsigned long long)(pc->remote_stream_id ? pc->remote_stream_id : 0), pc->active); + { uint16_t wnd_gap = TCP_WND_MAX(pcb) - pcb->rcv_wnd; + if (wnd_gap > 0) tcp_recved(pcb, wnd_gap); } pc->closing_tun = 1; return LERR_OK; } @@ -303,7 +305,7 @@ static void proxy_err_cb(void *arg, err_t err) { if (!pc) return; DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "TCP proxy: tcp error %d", err); pc->closing_tun = 1; - if (pc->transport) pc->transport->ops->close(pc->transport); + if (pc->transport && !pc->closing_sent) pc->transport->ops->close(pc->transport); } static err_t proxy_poll_cb(void *arg, struct tcp_pcb *pcb) {