| Index: chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
|
| diff --git a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
|
| index 6d3797e90860a786fb5bf23687c41d52b298ff18..91ecc54473fccd8100a24aba7c19db633e19c938 100644
|
| --- a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
|
| +++ b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
|
| @@ -7,146 +7,96 @@
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| -#include "base/command_line.h"
|
| #include "base/files/file_util.h"
|
| -#include "base/location.h"
|
| -#include "base/logging.h"
|
| #include "base/task_scheduler/post_task.h"
|
| -#include "base/threading/sequenced_worker_pool.h"
|
| -#include "chrome/common/chrome_utility_messages.h"
|
| #include "chrome/common/safe_browsing/zip_analyzer_results.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/child_process_data.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "ipc/ipc_message_macros.h"
|
| -#include "ipc/ipc_platform_file.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| -using content::BrowserThread;
|
| -
|
| namespace safe_browsing {
|
|
|
| -SandboxedZipAnalyzer::SandboxedZipAnalyzer(
|
| - const base::FilePath& zip_file,
|
| - const ResultCallback& result_callback)
|
| - : zip_file_name_(zip_file),
|
| - callback_(result_callback),
|
| - callback_called_(false) {
|
| +SandboxedZipAnalyzer::SandboxedZipAnalyzer(const base::FilePath& zip_file,
|
| + const ResultCallback& callback)
|
| + : file_path_(zip_file), callback_(callback) {
|
| + DCHECK(callback);
|
| }
|
|
|
| void SandboxedZipAnalyzer::Start() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - // Starting the analyzer will block on opening the zip file, so run this
|
| - // on a worker thread. The task does not need to block shutdown.
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| base::PostTaskWithTraits(
|
| - FROM_HERE, base::TaskTraits()
|
| - .MayBlock()
|
| - .WithPriority(base::TaskPriority::BACKGROUND)
|
| - .WithShutdownBehavior(
|
| - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
|
| - base::Bind(&SandboxedZipAnalyzer::AnalyzeInSandbox, this));
|
| + FROM_HERE,
|
| + base::TaskTraits()
|
| + .MayBlock()
|
| + .WithPriority(base::TaskPriority::BACKGROUND)
|
| + .WithShutdownBehavior(
|
| + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
|
| + base::Bind(&SandboxedZipAnalyzer::PrepareFileToAnalyze, this));
|
| }
|
|
|
| -SandboxedZipAnalyzer::~SandboxedZipAnalyzer() {
|
| - // If we're using UtilityProcessHost, we may not be destroyed on
|
| - // the UI or IO thread.
|
| - CloseTemporaryFile();
|
| -}
|
| +SandboxedZipAnalyzer::~SandboxedZipAnalyzer() = default;
|
|
|
| -void SandboxedZipAnalyzer::CloseTemporaryFile() {
|
| - if (!temp_file_.IsValid())
|
| - return;
|
| - // Close the temporary file in the blocking pool since doing so will delete
|
| - // the file.
|
| - base::PostTaskWithTraits(
|
| - FROM_HERE, base::TaskTraits()
|
| - .MayBlock()
|
| - .WithPriority(base::TaskPriority::BACKGROUND)
|
| - .WithShutdownBehavior(
|
| - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
|
| - base::Bind(&base::File::Close,
|
| - base::Owned(new base::File(std::move(temp_file_)))));
|
| -}
|
| +void SandboxedZipAnalyzer::PrepareFileToAnalyze() {
|
| + base::File file(file_path_, base::File::FLAG_OPEN | base::File::FLAG_READ);
|
|
|
| -void SandboxedZipAnalyzer::AnalyzeInSandbox() {
|
| - // This zip file will be closed on the IO thread once it has been handed
|
| - // off to the child process.
|
| - zip_file_.Initialize(zip_file_name_,
|
| - base::File::FLAG_OPEN | base::File::FLAG_READ);
|
| - if (!zip_file_.IsValid()) {
|
| - DVLOG(1) << "Could not open zip file: " << zip_file_name_.value();
|
| - if (!BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&SandboxedZipAnalyzer::OnAnalyzeZipFileFinished, this,
|
| - zip_analyzer::Results()))) {
|
| - NOTREACHED();
|
| - }
|
| + if (!file.IsValid()) {
|
| + DLOG(ERROR) << "Could not open file: " << file_path_.value();
|
| + ReportFileFailure();
|
| return;
|
| }
|
|
|
| - // This temp file will be closed in the blocking pool when results from the
|
| - // analyzer return.
|
| base::FilePath temp_path;
|
| + base::File temp_file;
|
| if (base::CreateTemporaryFile(&temp_path)) {
|
| - temp_file_.Initialize(temp_path, (base::File::FLAG_CREATE_ALWAYS |
|
| - base::File::FLAG_READ |
|
| - base::File::FLAG_WRITE |
|
| - base::File::FLAG_TEMPORARY |
|
| - base::File::FLAG_DELETE_ON_CLOSE));
|
| + temp_file.Initialize(
|
| + temp_path, (base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
|
| + base::File::FLAG_WRITE | base::File::FLAG_TEMPORARY |
|
| + base::File::FLAG_DELETE_ON_CLOSE));
|
| }
|
| - DVLOG_IF(1, !temp_file_.IsValid())
|
| - << "Could not open temporary output file: " << temp_path.value();
|
|
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&SandboxedZipAnalyzer::StartProcessOnIOThread, this));
|
| -}
|
| + if (!temp_file.IsValid()) {
|
| + DLOG(ERROR) << "Could not open temp file: " << temp_path.value();
|
| + ReportFileFailure();
|
| + return;
|
| + }
|
|
|
| -void SandboxedZipAnalyzer::OnProcessCrashed(int exit_code) {
|
| - OnAnalyzeZipFileFinished(zip_analyzer::Results());
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&SandboxedZipAnalyzer::AnalyzeFile, this, base::Passed(&file),
|
| + base::Passed(&temp_file)));
|
| }
|
|
|
| -void SandboxedZipAnalyzer::OnProcessLaunchFailed(int error_code) {
|
| - OnAnalyzeZipFileFinished(zip_analyzer::Results());
|
| -}
|
| +void SandboxedZipAnalyzer::ReportFileFailure() {
|
| + DCHECK(!utility_process_mojo_client_);
|
|
|
| -bool SandboxedZipAnalyzer::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(SandboxedZipAnalyzer, message)
|
| - IPC_MESSAGE_HANDLER(
|
| - ChromeUtilityHostMsg_AnalyzeZipFileForDownloadProtection_Finished,
|
| - OnAnalyzeZipFileFinished)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback_, Results()));
|
| }
|
|
|
| -void SandboxedZipAnalyzer::StartProcessOnIOThread() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - utility_process_host_ =
|
| - content::UtilityProcessHost::Create(
|
| - this, BrowserThread::GetTaskRunnerForThread(BrowserThread::IO).get())
|
| - ->AsWeakPtr();
|
| - utility_process_host_->SetName(l10n_util::GetStringUTF16(
|
| - IDS_UTILITY_PROCESS_SAFE_BROWSING_ZIP_FILE_ANALYZER_NAME));
|
| - utility_process_host_->Send(
|
| - new ChromeUtilityMsg_AnalyzeZipFileForDownloadProtection(
|
| - IPC::TakePlatformFileForTransit(std::move(zip_file_)),
|
| - IPC::GetPlatformFileForTransit(temp_file_.GetPlatformFile(),
|
| - false /* !close_source_handle */)));
|
| +void SandboxedZipAnalyzer::AnalyzeFile(base::File file, base::File temp_file) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + DCHECK(!utility_process_mojo_client_);
|
| +
|
| + utility_process_mojo_client_ = base::MakeUnique<
|
| + content::UtilityProcessMojoClient<chrome::mojom::SafeArchiveAnalyzer>>(
|
| + l10n_util::GetStringUTF16(
|
| + IDS_UTILITY_PROCESS_SAFE_BROWSING_ZIP_FILE_ANALYZER_NAME));
|
| + utility_process_mojo_client_->set_error_callback(
|
| + base::Bind(&SandboxedZipAnalyzer::AnalyzeFileDone, this, Results()));
|
| +
|
| + utility_process_mojo_client_->Start();
|
| +
|
| + utility_process_mojo_client_->service()->AnalyzeZipFile(
|
| + std::move(file), std::move(temp_file),
|
| + base::Bind(&SandboxedZipAnalyzer::AnalyzeFileDone, this));
|
| }
|
|
|
| -void SandboxedZipAnalyzer::OnAnalyzeZipFileFinished(
|
| - const zip_analyzer::Results& results) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - if (callback_called_)
|
| - return;
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(callback_, results));
|
| - callback_called_ = true;
|
| - CloseTemporaryFile();
|
| +void SandboxedZipAnalyzer::AnalyzeFileDone(const Results& results) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + utility_process_mojo_client_.reset();
|
| + callback_.Run(results);
|
| }
|
|
|
| } // namespace safe_browsing
|
|
|