summaryrefslogtreecommitdiffstats
path: root/components/scheduler/base/task_queue_selector_unittest.cc
diff options
context:
space:
mode:
authoralexclarke <alexclarke@chromium.org>2016-02-10 10:48:21 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-10 18:49:27 +0000
commitfae98b1d855879a11105a17be6b095fa4446f2da (patch)
tree475f99a2558a8cc9f8a5324de244084244f5e6df /components/scheduler/base/task_queue_selector_unittest.cc
parentebe6e34c371190558db374f42a12893e525cc081 (diff)
downloadchromium_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.cc12
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 {