fix: утечки памяти в router-сервисах и при shutdown

- conn_mgr_router_recv_handler / md_etcp_recv не освобождали entry (рантайм-утечка на каждое сообщение)
- reality_relay: registry + shutdown hook (отложенный free не отрабатывал при остановке)
- etcp_router: uasync_drain_immediate после destroy (router_close_finalize)
- мелкие callback-списки: activity_cbks, node_cbks, props_cbks/apply_cbks
This commit is contained in:
evgeny committed 2026-09-21 21:55:11 +03:00
1 parent 2f3001458f
commit 8a9d8d0097
7 files changed
+68 -12

No files matched your search

+11
View File
@@ -26,6 +26,7 @@
#include "radio/radio.h"
#include "radio/radio_headless.h"
#include "stcp_server.h"
#include "transport_layer/reality_relay.h"
#include "control_server.h"
#include "transport_layer/node_conn_direct.h"
#include "transport_layer/socket_monitor.h"
@@ -511,6 +512,7 @@ void utun_instance_destroy(struct UTUN_INSTANCE *instance) {
/* Phase J: TCP connections + sockets — MUST be before ETCP connections */
stcp_server_list_destroy_all(instance);
reality_relay_shutdown(); /* активные reality-релеи откладывают u_free через call_soon */
if (instance->tcp_connections) {
struct ll_entry* entry = instance->tcp_connections->head;
int tc = 0;
@@ -577,6 +579,9 @@ void utun_instance_destroy(struct UTUN_INSTANCE *instance) {
/* Phase N: etcp_router + nat_det + firewall */
etcp_router_destroy(instance);
/* etcp_router_destroy откладывает queue_entry_free(rconn->ll) через uasync_call_soon
(router_close_finalize) — выкачать их, пока ua ещё жив. */
uasync_drain_immediate(instance->ua);
if (instance->nat_det) { nat_detection_destroy(instance->nat_det); instance->nat_det = NULL; }
fw_free(&instance->fw);
DEBUG_INFO(DEBUG_CATEGORY_SYS, "[DESTROY] N done — router/nat_det/fw");
@@ -634,6 +639,12 @@ void utun_instance_destroy(struct UTUN_INSTANCE *instance) {
instance->nodeinfo_cbks = r->next; u_free(r);
}
// Cleanup activity callback chain
while (instance->activity_cbks) {
struct utun_activity_cbk_entry* r = instance->activity_cbks;
instance->activity_cbks = r->next; u_free(r);
}
// Shared SQLite DB закрываем в самом конце: routing/chat/media/db_sync
// используют его во время всего teardown (см. topo_groups_destroy).
if (instance->topo_sqlite_db) {