From 98dcaae8534ad35c68beb2aaa42b2109d3a4266e Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 12 Oct 2026 11:46:13 +0200 Subject: [PATCH] Close viewers on malformed media and release terminal owners immediately --- tools/chatgui-android/libutun_lite/stream_bridge.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/chatgui-android/libutun_lite/stream_bridge.c b/tools/chatgui-android/libutun_lite/stream_bridge.c index ea184aee..d2a5526f 100644 --- a/tools/chatgui-android/libutun_lite/stream_bridge.c +++ b/tools/chatgui-android/libutun_lite/stream_bridge.c @@ -46,6 +46,7 @@ static struct media_queue video_queue, audio_queue, output_queue; static uint64_t list_group, cached_group, list_updated; static char *source_list; static void media_process(void *arg); +static void media_close(struct android_media_session *s, int kind); /* Очереди обмена pthread: LL_QUEUE принадлежит uasync и сюда не подходит. */ static void queue_append(struct media_queue *q, struct media_record *record) { @@ -134,16 +135,18 @@ static void media_event(struct UTUN_INSTANCE *inst, const struct stream_event *e && !viewer.stopping && (event->type != STREAM_EVENT_CLOSED || !stream_handle_active(viewer.handle))) { if (event->type == STREAM_EVENT_DATA) { int result = stream_media_receiver_feed(viewer.receiver, event->data, event->length); - if (result != STREAM_OK || viewer.rx_overflow) { + if (result != STREAM_OK) { + DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "Android viewer malformed/unsupported media id=%llu result=%d; closing", + (unsigned long long)viewer.id, result); + media_close(&viewer, 6); + } else if (viewer.rx_overflow) { stream_media_receiver_gap(viewer.receiver); viewer.rx_overflow = 0; media_output(viewer.id, 3, NULL, 0, 0, NULL, 0); } } else if (event->type == STREAM_EVENT_GAP) { stream_media_receiver_gap(viewer.receiver); media_output(viewer.id, 3, NULL, 0, 0, NULL, 0); } else { - media_output(viewer.id, event->type == STREAM_EVENT_END ? 5 : 6, NULL, 0, event->reason, NULL, 0); - stream_close(viewer.handle); viewer.handle = NULL; - stream_media_receiver_destroy(viewer.receiver); viewer.receiver = NULL; viewer.stopping = 1; + media_close(&viewer, event->type == STREAM_EVENT_END ? 5 : 6); } } pthread_mutex_unlock(&media_lock);