Browse Source

tcp_proxy_client: skip tcp_shutdown on TIME_WAIT/CLOSED pcb

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 перед вызовом.
etcp-inflight-fix
Evgeny 4 months ago
parent
commit
483bf440fb
  1. 1
      src/proxy/tcp_proxy_client.c

1
src/proxy/tcp_proxy_client.c

@ -470,6 +470,7 @@ 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;
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);

Loading…
Cancel
Save