Browse Source

etcp: tcp_link_close_cb — сохранять link поля до каскада (UAF local_link_id)

v2
evgeny 2 weeks ago
parent
commit
1f8ccabdbf
  1. 13
      src/transport_layer/etcp_connections.c

13
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; struct ETCP_LINK *link = (struct ETCP_LINK *)arg;
if (!link || !link->etcp) return; if (!link || !link->etcp) return;
if (link->etcp->state == 2) return; if (link->etcp->state == 2) return;
/* Сохраняем до каскада: etcp_on_link_down может закрыть conn и освободить link */
int old_state = link->link_state; 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); stcp_link_close(sl);
link->tcp_link = NULL; link->tcp_link = NULL;
etcp_fire_link_status_cbk(link, old_state, 0); etcp_fire_link_status_cbk(link, old_state, 0);
if (link->is_server) { if (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); 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); etcp_on_link_down(etcp, link);
if (etcp->state != 2) { if (etcp->state != 2) {
etcp_link_close(link); etcp_link_close(link);
} else { } else {
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] TCP server link %d already closed by conn teardown, skip", 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 { } 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); etcp_on_link_down(etcp, link);
if (etcp->state != 2) etcp_tcp_link_start_reconnect(link); if (etcp->state != 2) etcp_tcp_link_start_reconnect(link);
} }

Loading…
Cancel
Save