From 83bf76dd417c91a4c78b1d30e91e273e95eb21a7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 24 Oct 2026 17:33:32 +0200 Subject: [PATCH] Release borrowed send-hook owners before ETCP link teardown --- src/transport_layer/etcp_connections.c | 5 +++++ src/transport_layer/etcp_connections.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index 8a55b86d..9ff93bae 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -1089,6 +1089,7 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn link->link_status = 0; link->send_hook = NULL; link->send_hook_ctx = NULL; + link->send_hook_release = NULL; // Initialize keepalive timeout from global config if (etcp->instance && etcp->instance->config) { @@ -1238,6 +1239,10 @@ void etcp_link_close(struct ETCP_LINK* link) { link->closing = 1; struct ETCP_CONN *etcp = link->etcp; etcp->callbacks_running++; + void (*release_hook)(struct ETCP_LINK*, void*) = link->send_hook_release; + void* hook_context = link->send_hook_ctx; + link->send_hook = NULL; link->send_hook_ctx = NULL; link->send_hook_release = NULL; + if (release_hook) release_hook(link, hook_context); int old_state = link->link_state, old_status = link->link_status; link->link_status = link->recv_keepalive = link->initialized = 0; if (link->rx_timeout_timer) { diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index 679e372a..abfb444a 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -364,6 +364,7 @@ struct ETCP_LINK { etcp_udp_send_fn_t send_hook; // Перехват прямого UDP; NULL = socket_sendto, SOCKS5 имеет приоритет void* send_hook_ctx; + void (*send_hook_release)(struct ETCP_LINK*, void*); // Необязательная отвязка ctx при close; три поля очищаются до вызова struct sockaddr_storage local_bound_addr; // локальный адрес к которому привязан линк (interface_addr на момент создания) uint8_t is_tcp; // 1 = TCP транспорт (STCP)