diff options
author | alexclarke <alexclarke@chromium.org> | 2016-02-10 10:48:21 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-10 18:49:27 +0000 |
commit | fae98b1d855879a11105a17be6b095fa4446f2da (patch) | |
tree | 475f99a2558a8cc9f8a5324de244084244f5e6df /components/scheduler/base/task_queue_selector_unittest.cc | |
parent | ebe6e34c371190558db374f42a12893e525cc081 (diff) | |
download | chromium_src-fae98b1d855879a11105a17be6b095fa4446f2da.zip chromium_src-fae98b1d855879a11105a17be6b095fa4446f2da.tar.gz chromium_src-fae98b1d855879a11105a17be6b095fa4446f2da.tar.bz2 |
Fix bug with TaskQueueSelector and blocked queues
The TaskQueueSelector is only supposed to touch the blocked_selector_
iff queue->should_report_when_execution_blocked() is true. Unfortunately
TaskQueueSelector::EnableQueue unconditionally added queues to the
blocked_selector_ leading to a potential UAF.
BUG=581973, 584544, 582712, 585744
Review URL: https://codereview.chromium.org/1685093002
Cr-Commit-Position: refs/heads/master@{#374692}
Diffstat (limited to 'components/scheduler/base/task_queue_selector_unittest.cc')
-rw-r--r-- | components/scheduler/base/task_queue_selector_unittest.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/components/scheduler/base/task_queue_selector_unittest.cc b/components/scheduler/base/task_queue_selector_unittest.cc index 755e97e0..3d48ba9 100644 --- a/components/scheduler/base/task_queue_selector_unittest.cc +++ b/components/scheduler/base/task_queue_selector_unittest.cc @@ -126,6 +126,10 @@ class TaskQueueSelectorTest : public testing::Test { void TearDown() final { for (scoped_refptr<TaskQueueImpl>& task_queue : task_queues_) { task_queue->UnregisterTaskQueue(); + // Note since this test doesn't have a TaskQueueManager we need to + // manually remove |task_queue| from the |selector_|. Normally + // UnregisterTaskQueue would do that. + selector_.RemoveQueue(task_queue.get()); } } @@ -187,7 +191,7 @@ TEST_F(TaskQueueSelectorTest, TestObserverWithEnabledQueue) { TEST_F(TaskQueueSelectorTest, TestObserverWithSetQueuePriorityAndQueueAlreadyEnabled) { - selector_.SetQueuePriority(task_queues_[1].get(), TaskQueue::NORMAL_PRIORITY); + selector_.SetQueuePriority(task_queues_[1].get(), TaskQueue::HIGH_PRIORITY); MockObserver mock_observer; selector_.SetTaskQueueSelectorObserver(&mock_observer); EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(0); @@ -294,7 +298,7 @@ TEST_F(TaskQueueSelectorTest, TestBestEffortGetsStarved) { PushTasks(queue_order, 2); selector_.SetQueuePriority(task_queues_[0].get(), TaskQueue::BEST_EFFORT_PRIORITY); - selector_.SetQueuePriority(task_queues_[1].get(), TaskQueue::NORMAL_PRIORITY); + EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, task_queues_[1]->GetQueuePriority()); WorkQueue* chosen_work_queue = nullptr; for (int i = 0; i < 100; i++) { EXPECT_TRUE(selector_.SelectWorkQueueToService(&chosen_work_queue)); @@ -390,6 +394,7 @@ TEST_F(TaskQueueSelectorTest, TestObserverWithOneBlockedQueue) { EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); task_queue->UnregisterTaskQueue(); + selector.RemoveQueue(task_queue.get()); } TEST_F(TaskQueueSelectorTest, TestObserverWithTwoBlockedQueues) { @@ -422,12 +427,13 @@ TEST_F(TaskQueueSelectorTest, TestObserverWithTwoBlockedQueues) { // Removing the second queue and selecting again should result in another // notification. + task_queue->UnregisterTaskQueue(); selector.RemoveQueue(task_queue.get()); EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1); EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); - task_queue->UnregisterTaskQueue(); task_queue2->UnregisterTaskQueue(); + selector.RemoveQueue(task_queue2.get()); } struct ChooseOldestWithPriorityTestParam { |