diff --git a/src/routing_layer/route_connectivity.c b/src/routing_layer/route_connectivity.c index 1f82f062..896e7bef 100644 --- a/src/routing_layer/route_connectivity.c +++ b/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-пробы не имеют - * хендла — они отсоединяются и освобождаются своим штатным ping_timeout/PONG. */ +/* Отменяет все пробы узла и освобождает контексты до закрытия сокетов/группы. + * TCP destroy вызывает callback; UDP cancel удаляет pending без callback. */ static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) { if (!nq) return; 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; struct stcp_client* cli = ctx->tcp_cli; 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; } }