From 33e403ab446f00a6bf58bf80c64c7d66579cb32a Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 4 Nov 2026 00:32:08 +0100 Subject: [PATCH] Prevent pending member versions from affecting radio and stream state --- src/radio/radio.c | 4 ++-- src/stream/stream.c | 2 +- src/stream/stream_member.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/radio/radio.c b/src/radio/radio.c index bd3ee6476..87b84ed10 100644 --- a/src/radio/radio.c +++ b/src/radio/radio.c @@ -518,7 +518,7 @@ static int radio_load_muted_members(struct radio_ctx* ctx) { struct UTUN_INSTANCE* inst = ctx->group->instance; sqlite3* db = inst->topo_sqlite_db; char sql[160]; - snprintf(sql, sizeof(sql), "SELECT node_id FROM \"peers_%llu\" WHERE radio_muted<>0", + snprintf(sql, sizeof(sql), "SELECT node_id FROM \"peers_%llu\" WHERE record_state=0 AND radio_muted<>0", (unsigned long long)ctx->group->group_id); sqlite3_stmt* st = NULL; if (!db || sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) { @@ -602,7 +602,7 @@ int radio_set_member_muted(struct UTUN_INSTANCE* inst, uint64_t group_id, uint64 ctx->muted_members = next; } char sql[160]; - snprintf(sql, sizeof(sql), "UPDATE \"peers_%llu\" SET radio_muted=? WHERE node_id=?", (unsigned long long)group_id); + snprintf(sql, sizeof(sql), "UPDATE \"peers_%llu\" SET radio_muted=? WHERE node_id=? AND record_state=0", (unsigned long long)group_id); stage = "prepare"; rc = sqlite3_prepare_v2(db, sql, -1, &st, NULL); if (rc != SQLITE_OK) goto error; stage = "bind mute"; rc = sqlite3_bind_int(st, 1, muted); if (rc != SQLITE_OK) goto error; stage = "bind member"; rc = sqlite3_bind_int64(st, 2, (sqlite3_int64)node_id); if (rc != SQLITE_OK) goto error; diff --git a/src/stream/stream.c b/src/stream/stream.c index 4a8616de4..c94138d87 100644 --- a/src/stream/stream.c +++ b/src/stream/stream.c @@ -98,7 +98,7 @@ int stream_sources_json(struct UTUN_INSTANCE *inst, uint64_t group_id, char **ou if (!db) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "stream source list missing DB"); return STREAM_ERR_STATE; } char query[320]; snprintf(query, sizeof(query), "SELECT p.node_id,COALESCE(NULLIF(p.local_nick,''),n.name,'') " - "FROM \"peers_%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id ORDER BY p.node_id", group->channel_id); + "FROM \"peers_%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id WHERE p.record_state=0 ORDER BY p.node_id", group->channel_id); struct strbuf json = strbuf_new(); sqlite3_stmt *statement = NULL; int result = STREAM_OK, count = 0; diff --git a/src/stream/stream_member.c b/src/stream/stream_member.c index 24de2ec28..c76170543 100644 --- a/src/stream/stream_member.c +++ b/src/stream/stream_member.c @@ -164,7 +164,7 @@ int stream_member_load(struct UTUN_INSTANCE *inst, uint64_t group_id, uint64_t m } char query[256]; snprintf(query, sizeof(query), "SELECT source,x25519_pubkey,ed25519_pubkey,join_sig,join_ts,update_sig,update_ts," - "userinfo,signed_by,signature,deleted,admitted FROM \"peers_%s\" WHERE node_id=?", group->channel_id); + "userinfo,signed_by,signature,deleted,admitted FROM \"peers_%s\" WHERE node_id=? AND record_state=0", group->channel_id); sqlite3_stmt *statement = NULL; sqlite3 *db = inst->topo_sqlite_db; if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) != SQLITE_OK) { @@ -240,7 +240,7 @@ int stream_member_supernode(struct UTUN_INSTANCE *inst, uint64_t group_id, uint6 DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "member role invalid channel namespace group=%llx", (unsigned long long)group_id); return -1; } char query[192]; - snprintf(query, sizeof(query), "SELECT adm_tags FROM \"peers_%s\" WHERE node_id=? AND deleted=0 AND admitted=1", group->channel_id); + snprintf(query, sizeof(query), "SELECT adm_tags FROM \"peers_%s\" WHERE node_id=? AND record_state=0 AND deleted=0 AND admitted=1", group->channel_id); sqlite3 *db = inst->topo_sqlite_db; sqlite3_stmt *statement = NULL; int result = -1, rc = sqlite3_prepare_v2(db, query, -1, &statement, NULL); if (rc == SQLITE_OK) rc = sqlite3_bind_int64(statement, 1, (sqlite3_int64)member_id);