From b7653310766909158a4781fe9def5fb8e9414d1a Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 06 May 2024 11:20:27 +0200 Subject: [PATCH] Video capture PipeWire: drop corrupted PipeWire buffers Use SPA_CHUNK_FLAG_CORRUPTED and SPA_META_HEADER_FLAG_CORRUPTED flags to determine corrupted buffers or corrupted buffer data. We used to only rely on compositors setting chunk->size, but this doesn't make sense for dmabufs where they have to make up arbitrary values. It also looks this is not reliable and can cause glitches as we end up processing corrupted buffers. Bug: webrtc:338232699 Change-Id: Ida0c6a5e7a37e19598c6d5884726200f81b94962 --- diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc index 6998d65..f7feddd 100644 --- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc +++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc @@ -323,6 +323,15 @@ return; } + struct spa_meta_header* header = + static_cast(spa_buffer_find_meta_data( + buffer->buffer, SPA_META_Header, sizeof(*header))); + if (header && (header->flags & SPA_META_HEADER_FLAG_CORRUPTED)) { + RTC_LOG(LS_WARNING) << "Dropping corrupted buffer"; + pw_stream_queue_buffer(that->pw_stream_, buffer); + return; + } + that->ProcessBuffer(buffer); pw_stream_queue_buffer(that->pw_stream_, buffer); @@ -709,7 +718,14 @@ } } - if (spa_buffer->datas[0].chunk->size == 0) { + if (spa_buffer->datas[0].chunk->flags & SPA_CHUNK_FLAG_CORRUPTED) { + RTC_LOG(LS_WARNING) << "Dropping buffer with corrupted data"; + return; + } + + if (spa_buffer->datas[0].type == SPA_DATA_MemFd && + spa_buffer->datas[0].chunk->size == 0) { + RTC_LOG(LS_WARNING) << "Dropping buffer with empty data"; return; }