From 41057ee9d5cb60f2714392326cd8146efda3892a Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 14:54:18 +0200 Subject: [PATCH] Keep media task ownership through synchronous submission events --- src/chat/chat_msg.c | 3 ++- tests/test_media_index_regressions.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/chat/chat_msg.c b/src/chat/chat_msg.c index 51eac980..83bb2af3 100644 --- a/src/chat/chat_msg.c +++ b/src/chat/chat_msg.c @@ -178,12 +178,13 @@ static void media_submit_finish(struct media_submit_ctx* ctx, int success) { struct UTUN_INSTANCE* inst = ctx->inst; struct chat_core_ctx* cc = CC(inst); char channel[64]; snprintf(channel, sizeof(channel), "%s", ctx->channel_id); + /* Синхронный обработчик события может запросить удаление; ctx пока остаётся в списке владельца. */ + chat_event_submitted(ctx->inst, ctx->request_id, success); int delete_pending = ctx->delete_pending; struct media_submit_ctx** slot = &cc->media_submissions; while (*slot && *slot != ctx) slot = &(*slot)->next; if (*slot) *slot = ctx->next; else DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "media submission missing from owner ch=%s", channel); - chat_event_submitted(ctx->inst, ctx->request_id, success); u_free(ctx); if (delete_pending) { for (struct media_submit_ctx* pending = cc->media_submissions; pending; pending = pending->next) diff --git a/tests/test_media_index_regressions.c b/tests/test_media_index_regressions.c index 774e5922..58e5b1c3 100644 --- a/tests/test_media_index_regressions.c +++ b/tests/test_media_index_regressions.c @@ -189,7 +189,8 @@ static void pending_deletion(void) { snprintf(req.media_dest, sizeof(req.media_dest), "%s", destinations[i]); req.request_id = i + 1; chat_core_submit_media_message(inst, &req); } - assert(CC(inst)->media_submissions && CC(inst)->media_submissions->next); /* completions не обработаны */ + assert(CC(inst)->media_submissions && !failed_submissions); + assert(scalar(db, "SELECT count(*) FROM media_preparations") == 2); /* completions не обработаны */ chat_core_delete_channel(inst, channel); chat_core_delete_channel(inst, channel); assert(!deleted_events && scalar(db, "SELECT count(*) FROM channels WHERE name='pending'") == 1); req.request_id = 3; chat_core_submit_media_message(inst, &req); assert(failed_submissions == 1);