[TTVD] Fixed rare crash in `TTvdVideoDecoderProxy::ReleasePicture` 73/322473/5
authorPiotr Bałut <p.balut@samsung.com>
Tue, 1 Apr 2025 14:12:58 +0000 (16:12 +0200)
committerBot Blink <blinkbot@samsung.com>
Fri, 18 Apr 2025 09:05:52 +0000 (09:05 +0000)
[PROBLEM]
TTvdVideoDecoder binds a mailbox release callback to a function called
on a WeakPtr, which in turn calls TTvdVideoDecoderProxy::ReleasePicture
mojo function. However, mailbox release callback is NOT called on the
thread to which weak ptr and mojo interfaces are bound. This results in
a race which sometimes results in a segmentation fault in:

```
 #0  0xb2a416b0 in mojo::internal::SendMojoMessage(mojo::MessageReceiver&, mojo::Message&) () from /usr/share/chromium-efl/lib/libchromium-impl.so
 #1  0xb133c98c in media::mojom::TTvdVideoDecoderProxy::ReleasePicture(base::UnguessableToken const&, gpu::SyncToken const&) () from /usr/share/chromium-efl/lib/libchromium-impl.so
...
 #6  0xb0dfd576 in base::RepeatingCallback<void (bool, base::WaitableEvent*)>::Run(bool, base::WaitableEvent*) && () from /usr/share/chromium-efl/lib/libchromium-impl.so
 #7  0xb13763d2 in media::VideoFrame::~VideoFrame() () from /usr/share/chromium-efl/lib/libchromium-impl.so
```

[SOLUTION]
Mailbox release callback is changed so that it posts tasks to a proper
thread before both mojo interface and weak ptr are accessed.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-678
Signed-off-by: Piotr Bałut <p.balut@samsung.com>
Change-Id: I5f3bba40b246ff8d565ec672de0fe36ca4390761

media/filters/tizen/ttvd_video_decoder.cc

index 268e82f370441bf955abef428f79da4fb02037ce..33e03037eab3e57789af89edaba0e297ff8e976b 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/task/bind_post_task.h"
 #include "media/base/tizen/logger/media_logger.h"
 #include "media/mojo/common/mojo_decoder_buffer_converter.h"
 
@@ -93,8 +94,8 @@ void TTvdVideoDecoder::OnVideoFrameDecoded(
     const scoped_refptr<VideoFrame>& frame,
     const base::UnguessableToken& release_token) {
   TIZEN_MEDIA_LOG(VERBOSE) << "Frame decoded: " << frame->timestamp();
-  frame->SetReleaseMailboxCB(base::BindOnce(
-      &TTvdVideoDecoder::ReleaseVideoFrame, weak_this_, release_token));
+  frame->SetReleaseMailboxCB(base::BindPostTaskToCurrentDefault(base::BindOnce(
+      &TTvdVideoDecoder::ReleaseVideoFrame, weak_this_, release_token)));
   output_cb_.Run(frame);
 }