Browse Source

Cancel UDP route probes with their contexts before socket teardown

master
evgeny 7 days ago
parent
commit
99382cf823
  1. 6
      src/routing_layer/route_connectivity.c

6
src/routing_layer/route_connectivity.c

@ -450,9 +450,8 @@ void route_connectivity_probe_node(struct UTUN_INSTANCE* instance, struct TOPO_G
} }
} }
/* Отсоединяет все влётные пробы узла: зануляет ctx->nq (чтобы conn_probe_finish не /* Отменяет все пробы узла и освобождает контексты до закрытия сокетов/группы.
* трогал освобождаемый nq) и досрочно закрывает влётные TCP-пинги. UDP-пробы не имеют * TCP destroy вызывает callback; UDP cancel удаляет pending без callback. */
* хендла — они отсоединяются и освобождаются своим штатным ping_timeout/PONG. */
static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) { static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) {
if (!nq) return; if (!nq) return;
struct route_nat_defer *deferred = nq->connectivity.nat_probe_wait; struct route_nat_defer *deferred = nq->connectivity.nat_probe_wait;
@ -478,6 +477,7 @@ static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) {
ctx->nq = NULL; ctx->nq = NULL;
struct stcp_client* cli = ctx->tcp_cli; struct stcp_client* cli = ctx->tcp_cli;
if (cli) stcp_client_destroy(cli); // синхронно: ping_close_cb → conn_probe_finish → u_free(ctx) if (cli) stcp_client_destroy(cli); // синхронно: ping_close_cb → conn_probe_finish → u_free(ctx)
else { etcp_cancel_pings(ctx->instance, conn_probe_single_cb, ctx); u_free(ctx); }
ctx = next; ctx = next;
} }
} }

Loading…
Cancel
Save