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); }