Browse Source

tcp_proxy_client: tcp_close→tcp_abort, fix tw_pcbs loop

При 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.
etcp-inflight-fix
Evgeny 4 months ago
parent
commit
6f1916b6b2
  1. 2
      src/proxy/tcp_proxy_client.c

2
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; pc->rem_closed = 1;
if (pc->tx_buf) { u_free(pc->tx_buf); pc->tx_buf = NULL; pc->tx_len = 0; } 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); 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); tcp_proxy_client_conn_free(pc);
} }

Loading…
Cancel
Save