From c33e4910c5dba2ba51eb95789d885f3eeb7e3d70 Mon Sep 17 00:00:00 2001 From: Yves Gerey Date: Thu, 2 Jan 2020 21:17:38 +0100 Subject: [PATCH] Prevent 'use after free' by waiting for all queued tasks to be processed. Sometimes, a task bound to VideoSendStreamTest was called after the underlying object had been destructed: 1. |test| goes out of scope. 2. There might still have been a task in fixture's queue, setup by OnSendRtp (capturing [this]) and invoked before the destruction of the fixture. This CL uses the same workaround than BandwidthStatsTest: block until all posted tasks are processed. This fixes the following flaky tests: * VideoSendStreamTest.ChangingNetworkRoute * VideoSendStreamTest.RespectsMinTransmitBitrate* Bug: webrtc:11156 Change-Id: I229c96d2abbbb60b43e9d9f62ad112507a21fe48 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163984 Reviewed-by: Niels Moller Reviewed-by: Karl Wiberg Commit-Queue: Yves Gerey Cr-Commit-Position: refs/heads/master@{#30152} --- video/video_send_stream_tests.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index eb6a72304c..f49a7633db 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -1711,6 +1711,12 @@ TEST_F(VideoSendStreamTest, ChangingNetworkRoute) { extensions_.Register(kExtensionId); } + ~ChangingNetworkRouteTest() { + // Block until all already posted tasks run to avoid 'use after free' + // when such task accesses |this|. + SendTask(RTC_FROM_HERE, task_queue_, [] {}); + } + void OnCallsCreated(Call* sender_call, Call* receiver_call) override { RTC_DCHECK_RUN_ON(&task_queue_thread_); RTC_DCHECK(!call_); @@ -1896,6 +1902,12 @@ class MaxPaddingSetTest : public test::SendTest { task_queue_thread_.Detach(); } + ~MaxPaddingSetTest() { + // Block until all already posted tasks run to avoid 'use after free' + // when such task accesses |this|. + SendTask(RTC_FROM_HERE, task_queue_, [] {}); + } + void ModifyVideoConfigs( VideoSendStream::Config* send_config, std::vector* receive_configs,