Browse Source

fix route_bgp etcp_send leaks and etcp_socket_remove infinite loop on link->conn==NULL

congestion
Evgeny 5 months ago
parent
commit
2d516bf16e
  1. 5
      src/etcp_connections.c
  2. 14
      src/route_bgp.c

5
src/etcp_connections.c

@ -748,8 +748,9 @@ void etcp_socket_remove(struct ETCP_SOCKET* conn) {
size_t i = 0; size_t i = 0;
while (i < conn->num_channels) { while (i < conn->num_channels) {
struct ETCP_LINK* l = conn->links[i]; struct ETCP_LINK* l = conn->links[i];
etcp_link_close(l); // теперь безопасно — num_channels уменьшится, но i не растёт int had_conn = (l->conn != NULL);
// i НЕ инкрементируем — сдвиг уже сделал remove_link etcp_link_close(l);
if (!had_conn) i++;
} }
u_free(conn->links); u_free(conn->links);

14
src/route_bgp.c

@ -1122,7 +1122,12 @@ void route_bgp_send_nat_info(struct ETCP_CONN* conn, uint8_t socket_id, uint32_t
conn->log_name, socket_id, conn->log_name, socket_id,
nat_type == NAT_TYPE_EIM ? "EIM" : "STRICT", nat_type == NAT_TYPE_EIM ? "EIM" : "STRICT",
ip_to_str(pkt->nat_ip, AF_INET).str, (unsigned)nat_port); ip_to_str(pkt->nat_ip, AF_INET).str, (unsigned)nat_port);
etcp_send(conn, e); int ret = etcp_send(conn, e);
if (ret != 0) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "etcp_send NAT_INFO failed: %d", ret);
u_free(pkt);
queue_entry_free(e);
}
} }
void route_bgp_send_nat_check_req(struct ETCP_CONN* conn, uint8_t socket_id) { void route_bgp_send_nat_check_req(struct ETCP_CONN* conn, uint8_t socket_id) {
@ -1157,7 +1162,12 @@ void route_bgp_send_nat_check_req(struct ETCP_CONN* conn, uint8_t socket_id) {
conn->log_name, socket_id, conn->log_name, socket_id,
ip_to_str(&pkt->interface_ip, AF_INET).str, ip_to_str(&pkt->interface_ip, AF_INET).str,
(unsigned)ntohs(pkt->interface_port)); (unsigned)ntohs(pkt->interface_port));
etcp_send(conn, e); int ret = etcp_send(conn, e);
if (ret != 0) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "etcp_send NAT_CHECK_REQ failed: %d", ret);
u_free(pkt);
queue_entry_free(e);
}
} }
void route_bgp_request_nat_check_all(struct ROUTE_BGP* bgp) { void route_bgp_request_nat_check_all(struct ROUTE_BGP* bgp) {

Loading…
Cancel
Save