Commit 5a0921ab authored by Patrick Monette's avatar Patrick Monette Committed by Commit Bot

Get the CertificateInfo of the current exe from ModuleDatabase

The ThirdPartyConflictsManager needs the CertificateInfo of the current
executable to identify third-party DLLs. It used to create it itself,
but that information is already available from the ModuleDatabase.

Bug: 921746
Change-Id: I3d57d289f17bac563fed498e59f48c3bbc9f4f64
Reviewed-on: https://chromium-review.googlesource.com/c/1426061Reviewed-by: default avatarSébastien Marchand <sebmarchand@chromium.org>
Commit-Queue: Patrick Monette <pmonette@chromium.org>
Cr-Commit-Position: refs/heads/master@{#624901}
parent 2d4f839f
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "chrome/browser/conflicts/module_blacklist_cache_updater_win.h" #include "chrome/browser/conflicts/module_blacklist_cache_updater_win.h"
#include "chrome/browser/conflicts/module_blacklist_cache_util_win.h" #include "chrome/browser/conflicts/module_blacklist_cache_util_win.h"
#include "chrome/browser/conflicts/module_info_util_win.h" #include "chrome/browser/conflicts/module_info_util_win.h"
#include "chrome/browser/conflicts/module_info_win.h"
#include "chrome/browser/conflicts/module_list_filter_win.h" #include "chrome/browser/conflicts/module_list_filter_win.h"
#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
...@@ -39,16 +40,6 @@ ...@@ -39,16 +40,6 @@
namespace { namespace {
std::unique_ptr<CertificateInfo> CreateExeCertificateInfo() {
auto certificate_info = std::make_unique<CertificateInfo>();
base::FilePath exe_path;
if (base::PathService::Get(base::FILE_EXE, &exe_path))
GetCertificateInfo(exe_path, certificate_info.get());
return certificate_info;
}
scoped_refptr<ModuleListFilter> CreateModuleListFilter( scoped_refptr<ModuleListFilter> CreateModuleListFilter(
const base::FilePath& module_list_path) { const base::FilePath& module_list_path) {
auto module_list_filter = base::MakeRefCounted<ModuleListFilter>(); auto module_list_filter = base::MakeRefCounted<ModuleListFilter>();
...@@ -144,11 +135,13 @@ ThirdPartyConflictsManager::ThirdPartyConflictsManager( ...@@ -144,11 +135,13 @@ ThirdPartyConflictsManager::ThirdPartyConflictsManager(
LogChromeElfThirdPartyStatus(); LogChromeElfThirdPartyStatus();
module_database_event_source_->AddObserver(this); module_database_event_source_->AddObserver(this);
base::PostTaskAndReplyWithResult(
background_sequence_.get(), FROM_HERE, // Get the path to the current executable as it will be used to retrieve its
base::BindOnce(&CreateExeCertificateInfo), // associated CertificateInfo from the ModuleDatabase. This shouldn't fail,
base::BindOnce(&ThirdPartyConflictsManager::OnExeCertificateCreated, // but it is assumed that without the path, the executable is not signed
weak_ptr_factory_.GetWeakPtr())); // (hence an empty CertificateInfo).
if (!base::PathService::Get(base::FILE_EXE, &exe_path_))
exe_certificate_info_ = std::make_unique<CertificateInfo>();
} }
ThirdPartyConflictsManager::~ThirdPartyConflictsManager() { ThirdPartyConflictsManager::~ThirdPartyConflictsManager() {
...@@ -190,6 +183,26 @@ void ThirdPartyConflictsManager::ShutdownAndDestroy( ...@@ -190,6 +183,26 @@ void ThirdPartyConflictsManager::ShutdownAndDestroy(
// |instance| is intentionally destroyed at the end of the function scope. // |instance| is intentionally destroyed at the end of the function scope.
} }
void ThirdPartyConflictsManager::OnNewModuleFound(
const ModuleInfoKey& module_key,
const ModuleInfoData& module_data) {
// Keep looking for the CertificateInfo of the current executable as long as
// it wasn't found yet.
if (exe_certificate_info_)
return;
DCHECK(!exe_path_.empty());
// The module represent the current executable only if the paths matches.
if (exe_path_ != module_key.module_path)
return;
exe_certificate_info_ = std::make_unique<CertificateInfo>(
module_data.inspection_result->certificate_info);
InitializeIfReady();
}
void ThirdPartyConflictsManager::OnModuleDatabaseIdle() { void ThirdPartyConflictsManager::OnModuleDatabaseIdle() {
if (on_module_database_idle_called_) if (on_module_database_idle_called_)
return; return;
...@@ -320,13 +333,6 @@ void ThirdPartyConflictsManager::OnEvent(Events event, ...@@ -320,13 +333,6 @@ void ThirdPartyConflictsManager::OnEvent(Events event,
SetTerminalState(State::kNoModuleListAvailableFailure); SetTerminalState(State::kNoModuleListAvailableFailure);
} }
void ThirdPartyConflictsManager::OnExeCertificateCreated(
std::unique_ptr<CertificateInfo> exe_certificate_info) {
exe_certificate_info_ = std::move(exe_certificate_info);
InitializeIfReady();
}
void ThirdPartyConflictsManager::OnModuleListFilterCreated( void ThirdPartyConflictsManager::OnModuleListFilterCreated(
scoped_refptr<ModuleListFilter> module_list_filter) { scoped_refptr<ModuleListFilter> module_list_filter) {
module_list_filter_ = std::move(module_list_filter); module_list_filter_ = std::move(module_list_filter);
......
...@@ -85,6 +85,8 @@ class ThirdPartyConflictsManager ...@@ -85,6 +85,8 @@ class ThirdPartyConflictsManager
std::unique_ptr<ThirdPartyConflictsManager> instance); std::unique_ptr<ThirdPartyConflictsManager> instance);
// ModuleDatabaseObserver: // ModuleDatabaseObserver:
void OnNewModuleFound(const ModuleInfoKey& module_key,
const ModuleInfoData& module_data) override;
void OnModuleDatabaseIdle() override; void OnModuleDatabaseIdle() override;
// Invoked when the Third Party Module List component is registered with the // Invoked when the Third Party Module List component is registered with the
...@@ -139,10 +141,6 @@ class ThirdPartyConflictsManager ...@@ -139,10 +141,6 @@ class ThirdPartyConflictsManager
} }
private: private:
// Called when |exe_certificate_info_| finishes its initialization.
void OnExeCertificateCreated(
std::unique_ptr<CertificateInfo> exe_certificate_info);
// Called when |module_list_filter_| finishes its initialization. // Called when |module_list_filter_| finishes its initialization.
void OnModuleListFilterCreated( void OnModuleListFilterCreated(
scoped_refptr<ModuleListFilter> module_list_filter); scoped_refptr<ModuleListFilter> module_list_filter);
...@@ -187,6 +185,9 @@ class ThirdPartyConflictsManager ...@@ -187,6 +185,9 @@ class ThirdPartyConflictsManager
// instances. // instances.
bool on_module_database_idle_called_; bool on_module_database_idle_called_;
// Path to the current executable (expected to be chrome.exe).
base::FilePath exe_path_;
// The certificate info of the current executable. // The certificate info of the current executable.
std::unique_ptr<CertificateInfo> exe_certificate_info_; std::unique_ptr<CertificateInfo> exe_certificate_info_;
......
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