From 1f8ccabdbf977a0195b39b1cde596f93055053d6 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 14 Sep 2026 13:39:07 +0300 Subject: [PATCH] =?UTF-8?q?etcp:=20tcp=5Flink=5Fclose=5Fcb=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D1=8F=D1=82=D1=8C=20link?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B4=D0=BE=20=D0=BA=D0=B0=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=B4=D0=B0=20(UAF=20local=5Flink=5Fid)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/transport_layer/etcp_connections.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index 55187775..b7040626 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -1256,24 +1256,27 @@ static void tcp_link_close_cb(struct stcp_link *sl, int err, void *arg) { struct ETCP_LINK *link = (struct ETCP_LINK *)arg; if (!link || !link->etcp) return; if (link->etcp->state == 2) return; + /* Сохраняем до каскада: etcp_on_link_down может закрыть conn и освободить link */ int old_state = link->link_state; - struct ETCP_CONN *etcp = link->etcp; /* сохранить до каскада: etcp_on_link_down может закрыть conn и освободить link */ + int is_server = link->is_server; + int local_link_id = link->local_link_id; + struct ETCP_CONN *etcp = link->etcp; stcp_link_close(sl); link->tcp_link = NULL; etcp_fire_link_status_cbk(link, old_state, 0); - if (link->is_server) { - DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d down err=%d, closing", link->etcp->log_name, link->local_link_id, err); + if (is_server) { + DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d down err=%d, closing", etcp->log_name, local_link_id, err); etcp_on_link_down(etcp, link); if (etcp->state != 2) { etcp_link_close(link); } else { DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d already closed by conn teardown, skip", - etcp->log_name, link->local_link_id); + etcp->log_name, local_link_id); } } else { - DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP link %d down err=%d, scheduling reconnect", link->etcp->log_name, link->local_link_id, err); + DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP link %d down err=%d, scheduling reconnect", etcp->log_name, local_link_id, err); etcp_on_link_down(etcp, link); if (etcp->state != 2) etcp_tcp_link_start_reconnect(link); }