From 09a3d09013fb62d73b56e818170cb49afc93463b Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 3 Nov 2026 20:00:09 +0100 Subject: [PATCH] Recheck broadcast admission between subscriber callbacks --- src/broadcast.c | 10 +++++++--- src/broadcast.h | 2 +- src/radio/radio.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/broadcast.c b/src/broadcast.c index 1b993ed03..df3b44bd5 100644 --- a/src/broadcast.c +++ b/src/broadcast.c @@ -154,9 +154,13 @@ void broadcast_remove_cbk(struct TOPO_GROUP* group, broadcast_recv_fn fn, void* } } -static void broadcast_fire_cbks(struct broadcast_ctx* ctx, const uint8_t* uuid, const uint8_t* data, uint16_t data_len) { +static void broadcast_fire_cbks(struct broadcast_ctx* ctx, struct ETCP_CONN* from_conn, + const uint8_t* uuid, const uint8_t* data, uint16_t data_len) { struct broadcast_cbk_entry* c = ctx->cbks; - while (c) { c->fn(uuid, data, data_len, c->arg); c = c->next; } + while (c) { + if (!topo_group_data_allowed(ctx->group, from_conn)) return; + c->fn(uuid, data, data_len, c->arg); c = c->next; + } } static void broadcast_cleanup_timer_cb(void* arg) { @@ -238,7 +242,7 @@ void broadcast_recv(struct TOPO_GROUP* group, struct ETCP_CONN* from_conn, const } } - broadcast_fire_cbks(ctx, uuid, data, data_len); + broadcast_fire_cbks(ctx, from_conn, uuid, data, data_len); } static void broadcast_recv_dispatcher(struct ETCP_CONN* from_conn, struct ll_entry* entry) { diff --git a/src/broadcast.h b/src/broadcast.h index 45ab9f6c0..fdf2a215d 100644 --- a/src/broadcast.h +++ b/src/broadcast.h @@ -39,7 +39,7 @@ int broadcast_init(struct TOPO_GROUP* group); // Отменяет таймер/standby-ожидание, освобождает кеш и регистрации, но не arg подписчиков; NULL/нет контекста допустимы. void broadcast_destroy(struct TOPO_GROUP* group); // data не NULL даже при data_len=0; data_len <= BROADCAST_MAX_DATA, группа должна быть инициализирована. -// 0 — данные сохранены в кеше и рассылка предпринята; -1 — аргументы/отсутствие контекста/OOM записи кеша. +// 0 — данные сохранены в кеше и рассылка предпринята; -1 — аргументы/контекст/отсутствие CHAT-допуска/OOM кеша. // Ошибки выделения/отправки отдельным соседям не меняют 0; собственные recv-callbacks не вызываются. int broadcast_send(struct TOPO_GROUP* group, const uint8_t* data, uint16_t data_len); // Добавляет fn(arg) в начало; дубликаты разрешены и вызываются отдельно. При NULL/нет контекста/OOM не добавляет. diff --git a/src/radio/radio.h b/src/radio/radio.h index 43987d364..0ae46cb22 100644 --- a/src/radio/radio.h +++ b/src/radio/radio.h @@ -59,7 +59,7 @@ void radio_set_mute_cb(struct UTUN_INSTANCE* inst, radio_mute_fn fn, void* arg); int radio_talk_begin(struct UTUN_INSTANCE* inst, uint64_t group_id); /* новая передача, seq=0 */ /* Копирует один Opus-кадр (1..512 байт); собирает radio_burst_frames (1..10, default4). * Настройка фиксируется при BEGIN. Неполная пачка уходит при END или через target*20мс от первого кадра. - * 0 — принят/устаревший хвост после END проигнорирован, -1 — неверные аргументы/нет группы. */ + * 0 — принят/устаревший хвост после END проигнорирован, -1 — неверные аргументы/нет группы/отозван CHAT-допуск. */ int radio_talk_send(struct UTUN_INSTANCE* inst, uint64_t group_id, const uint8_t* opus, int len); int radio_talk_end(struct UTUN_INSTANCE* inst, uint64_t group_id); /* Сначала хвост DATA, затем отдельный FIN. */