Commit a46c6023 authored by Robert Liao's avatar Robert Liao Committed by Commit Bot

Move the AV Check to the COM STA Task Runner

Previously, this ran in the Task Scheduler shared worker pool and
initialized an STA on its own, which blocks initializing the shared
worker pool as an MTA.

This change moves the work to the shared COM STA task runner as 
CLSID_WSCProductList expects to be run in an STA. CLSID_WbemLocator
is fine with an STA or MTA.

BUG=706479

Change-Id: I834b0fbcda47ea0168f0ce48c5ab3191adbf7f5e
Reviewed-on: https://chromium-review.googlesource.com/745317
Commit-Queue: Robert Liao <robliao@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512882}
parent d352df25
...@@ -27,9 +27,11 @@ ...@@ -27,9 +27,11 @@
#include "base/strings/string_split.h" #include "base/strings/string_split.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/task_runner_util.h"
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "base/version.h" #include "base/version.h"
#include "base/win/com_init_util.h"
#include "base/win/scoped_bstr.h" #include "base/win/scoped_bstr.h"
#include "base/win/scoped_com_initializer.h" #include "base/win/scoped_com_initializer.h"
#include "base/win/scoped_variant.h" #include "base/win/scoped_variant.h"
...@@ -161,18 +163,26 @@ void AntiVirusMetricsProvider::ProvideSystemProfileMetrics( ...@@ -161,18 +163,26 @@ void AntiVirusMetricsProvider::ProvideSystemProfileMetrics(
} }
void AntiVirusMetricsProvider::AsyncInit(const base::Closure& done_callback) { void AntiVirusMetricsProvider::AsyncInit(const base::Closure& done_callback) {
base::PostTaskWithTraitsAndReplyWithResult( // __uuidof(WSCProductList) expects to be run in an STA and CLSID_WbemLocator
// is fine with an STA or MTA. The COM STA task runner accomodates both of
// these requirements.
base::PostTaskAndReplyWithResult(
base::CreateCOMSTATaskRunnerWithTraits(
{base::MayBlock(), base::TaskPriority::BACKGROUND,
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})
.get(),
FROM_HERE, FROM_HERE,
{base::MayBlock(), base::TaskPriority::BACKGROUND, base::BindOnce(
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, &AntiVirusMetricsProvider::GetAntiVirusProductsOnCOMSTAThread),
base::Bind(&AntiVirusMetricsProvider::GetAntiVirusProductsOnFileThread), base::BindOnce(&AntiVirusMetricsProvider::GotAntiVirusProducts,
base::Bind(&AntiVirusMetricsProvider::GotAntiVirusProducts, weak_ptr_factory_.GetWeakPtr(), done_callback));
weak_ptr_factory_.GetWeakPtr(), done_callback));
} }
// static // static
std::vector<AntiVirusMetricsProvider::AvProduct> std::vector<AntiVirusMetricsProvider::AvProduct>
AntiVirusMetricsProvider::GetAntiVirusProductsOnFileThread() { AntiVirusMetricsProvider::GetAntiVirusProductsOnCOMSTAThread() {
base::win::AssertComApartmentType(base::win::ComApartmentType::STA);
std::vector<AvProduct> av_products; std::vector<AvProduct> av_products;
ResultCode result = RESULT_GENERIC_FAILURE; ResultCode result = RESULT_GENERIC_FAILURE;
...@@ -232,10 +242,6 @@ AntiVirusMetricsProvider::FillAntiVirusProductsFromWSC( ...@@ -232,10 +242,6 @@ AntiVirusMetricsProvider::FillAntiVirusProductsFromWSC(
std::vector<AvProduct>* products) { std::vector<AvProduct>* products) {
std::vector<AvProduct> result_list; std::vector<AvProduct> result_list;
base::AssertBlockingAllowed(); base::AssertBlockingAllowed();
base::win::ScopedCOMInitializer com_initializer;
if (!com_initializer.Succeeded())
return RESULT_FAILED_TO_INITIALIZE_COM;
Microsoft::WRL::ComPtr<IWSCProductList> product_list; Microsoft::WRL::ComPtr<IWSCProductList> product_list;
HRESULT result = HRESULT result =
...@@ -333,10 +339,6 @@ AntiVirusMetricsProvider::FillAntiVirusProductsFromWMI( ...@@ -333,10 +339,6 @@ AntiVirusMetricsProvider::FillAntiVirusProductsFromWMI(
std::vector<AvProduct>* products) { std::vector<AvProduct>* products) {
std::vector<AvProduct> result_list; std::vector<AvProduct> result_list;
base::AssertBlockingAllowed(); base::AssertBlockingAllowed();
base::win::ScopedCOMInitializer com_initializer;
if (!com_initializer.Succeeded())
return RESULT_FAILED_TO_INITIALIZE_COM;
Microsoft::WRL::ComPtr<IWbemLocator> wmi_locator; Microsoft::WRL::ComPtr<IWbemLocator> wmi_locator;
HRESULT hr = HRESULT hr =
......
...@@ -77,7 +77,7 @@ class AntiVirusMetricsProvider : public metrics::MetricsProvider { ...@@ -77,7 +77,7 @@ class AntiVirusMetricsProvider : public metrics::MetricsProvider {
static void MaybeAddUnregisteredAntiVirusProducts( static void MaybeAddUnregisteredAntiVirusProducts(
std::vector<AvProduct>* products); std::vector<AvProduct>* products);
static std::vector<AvProduct> GetAntiVirusProductsOnFileThread(); static std::vector<AvProduct> GetAntiVirusProductsOnCOMSTAThread();
// Removes anything extraneous from the end of the product name such as // Removes anything extraneous from the end of the product name such as
// versions, years, or anything containing numbers to make it more constant. // versions, years, or anything containing numbers to make it more constant.
......
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