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 |