From d78d652bf59c4938d3bd4044d1ede6e696b99cf2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 14 Sep 2026 11:47:45 +0300 Subject: [PATCH] =?UTF-8?q?shutdown:=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20shared=20sqlite=20(topo=5Fsqlite=5Fd?= =?UTF-8?q?b)=20=D0=B2=20=D1=81=D0=B0=D0=BC=D0=BE=D0=BC=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=86=D0=B5=20utun=5Finstance=5Fdestroy=20(UAF=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20teardown)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routing_layer/topo_group.c | 5 +++-- src/utun_instance.c | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/routing_layer/topo_group.c b/src/routing_layer/topo_group.c index 75b13291..816ab89e 100644 --- a/src/routing_layer/topo_group.c +++ b/src/routing_layer/topo_group.c @@ -502,8 +502,9 @@ void topo_groups_destroy(struct UTUN_INSTANCE* instance) { memory_pool_destroy(g->v6_subnet_pool); DEBUG_INFO(DEBUG_CATEGORY_SYS, "[TOPO_DESTROY] 7 pools destroyed"); - if (instance->topo_sqlite_db) { sqlite3_close(instance->topo_sqlite_db); instance->topo_sqlite_db = NULL; } - DEBUG_INFO(DEBUG_CATEGORY_SYS, "[TOPO_DESTROY] 8 sqlite closed"); + /* Shared SQLite DB закрывается в utun_instance_destroy() в самом конце — + * chat/media/db_sync ещё используют его во время teardown. */ + DEBUG_INFO(DEBUG_CATEGORY_SYS, "[TOPO_DESTROY] 8 sqlite deferred (закрывается в utun_instance_destroy)"); u_free(g); instance->topo_groups = NULL; instance->conn_mgr = NULL; DEBUG_INFO(DEBUG_CATEGORY_SYS, "[TOPO_DESTROY] 9 done"); diff --git a/src/utun_instance.c b/src/utun_instance.c index d6f0b6e7..eceb7ff8 100644 --- a/src/utun_instance.c +++ b/src/utun_instance.c @@ -614,6 +614,14 @@ void utun_instance_destroy(struct UTUN_INSTANCE *instance) { instance->nodeinfo_cbks = r->next; u_free(r); } + // Shared SQLite DB закрываем в самом конце: routing/chat/media/db_sync + // используют его во время всего teardown (см. topo_groups_destroy). + if (instance->topo_sqlite_db) { + sqlite3_close(instance->topo_sqlite_db); + instance->topo_sqlite_db = NULL; + DEBUG_INFO(DEBUG_CATEGORY_SYS, "[INSTANCE_DESTROY] shared sqlite closed"); + } + u_free(instance); DEBUG_INFO(DEBUG_CATEGORY_SYS, "[INSTANCE_DESTROY] Instance destroyed completely"); }