Commit a77f654a authored by Danil Chapovalov's avatar Danil Chapovalov Committed by Commit Bot

Fix UB in WebrtcTaskQueue::RunTask

by making WebrtcTaskQueue::RunTask properly static

RunTask supports running after WebrtcTaskQueue is destroyed, it has protection |this| is not accessed in that case, however calling non-static non-virtual function of a destroyed object is still an undefined behaviour

Bug: chromium:933851
Change-Id: Idc30bc59eff1193997d7e53537cd1493b668dd08
Reviewed-on: https://chromium-review.googlesource.com/c/1479233Reviewed-by: default avatarPer Kjellander <perkj@chromium.org>
Reviewed-by: default avatarHenrik Grunell <grunell@chromium.org>
Reviewed-by: default avatarTommi <tommi@chromium.org>
Auto-Submit: Danil Chapovalov <danilchap@chromium.org>
Commit-Queue: Henrik Grunell <grunell@chromium.org>
Commit-Queue: Tommi <tommi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#634608}
parent 41c4a11b
...@@ -32,8 +32,9 @@ class WebrtcTaskQueue final : public webrtc::TaskQueueBase { ...@@ -32,8 +32,9 @@ class WebrtcTaskQueue final : public webrtc::TaskQueueBase {
private: private:
~WebrtcTaskQueue() override = default; ~WebrtcTaskQueue() override = default;
void RunTask(scoped_refptr<base::RefCountedData<bool>> is_active, static void RunTask(WebrtcTaskQueue* task_queue,
std::unique_ptr<webrtc::QueuedTask> task); scoped_refptr<base::RefCountedData<bool>> is_active,
std::unique_ptr<webrtc::QueuedTask> task);
const scoped_refptr<base::SequencedTaskRunner> task_runner_; const scoped_refptr<base::SequencedTaskRunner> task_runner_;
// Value of |is_active_| is checked and set on |task_runner_|. // Value of |is_active_| is checked and set on |task_runner_|.
...@@ -57,12 +58,13 @@ void WebrtcTaskQueue::Delete() { ...@@ -57,12 +58,13 @@ void WebrtcTaskQueue::Delete() {
} }
void WebrtcTaskQueue::RunTask( void WebrtcTaskQueue::RunTask(
WebrtcTaskQueue* task_queue,
scoped_refptr<base::RefCountedData<bool>> is_active, scoped_refptr<base::RefCountedData<bool>> is_active,
std::unique_ptr<webrtc::QueuedTask> task) { std::unique_ptr<webrtc::QueuedTask> task) {
if (!is_active->data) if (!is_active->data)
return; return;
CurrentTaskQueueSetter set_current(this); CurrentTaskQueueSetter set_current(task_queue);
webrtc::QueuedTask* task_ptr = task.release(); webrtc::QueuedTask* task_ptr = task.release();
if (task_ptr->Run()) { if (task_ptr->Run()) {
// Delete task_ptr before CurrentTaskQueueSetter clears state that this code // Delete task_ptr before CurrentTaskQueueSetter clears state that this code
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment