1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/chrome_cleaner/parsers/broker/sandbox_setup_hooks.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "chrome/chrome_cleaner/constants/chrome_cleaner_switches.h"
11 #include "chrome/chrome_cleaner/mojom/parser_interface.mojom.h"
12 #include "chrome/chrome_cleaner/settings/settings_types.h"
13 #include "mojo/public/cpp/bindings/pending_remote.h"
14 #include "mojo/public/cpp/bindings/remote.h"
15 
16 namespace chrome_cleaner {
17 
ParserSandboxSetupHooks(scoped_refptr<MojoTaskRunner> mojo_task_runner,base::OnceClosure connection_error_handler)18 ParserSandboxSetupHooks::ParserSandboxSetupHooks(
19     scoped_refptr<MojoTaskRunner> mojo_task_runner,
20     base::OnceClosure connection_error_handler)
21     : mojo_task_runner_(mojo_task_runner),
22       connection_error_handler_(std::move(connection_error_handler)),
23       parser_(new mojo::Remote<mojom::Parser>(),
24               base::OnTaskRunnerDeleter(mojo_task_runner_)) {}
25 
26 ParserSandboxSetupHooks::~ParserSandboxSetupHooks() = default;
27 
UpdateSandboxPolicy(sandbox::TargetPolicy * policy,base::CommandLine * command_line)28 ResultCode ParserSandboxSetupHooks::UpdateSandboxPolicy(
29     sandbox::TargetPolicy* policy,
30     base::CommandLine* command_line) {
31   // Unretained reference is safe because the parser remote is taken by the
32   // caller and is expected to retain it for the life of the sandboxed process.
33   mojo_task_runner_->PostTask(
34       FROM_HERE, base::BindOnce(&ParserSandboxSetupHooks::BindParserRemote,
35                                 base::Unretained(this),
36                                 SetupSandboxMessagePipe(policy, command_line),
37                                 base::Unretained(parser_.get())));
38 
39   return RESULT_CODE_SUCCESS;
40 }
41 
BindParserRemote(mojo::ScopedMessagePipeHandle pipe_handle,mojo::Remote<mojom::Parser> * parser)42 void ParserSandboxSetupHooks::BindParserRemote(
43     mojo::ScopedMessagePipeHandle pipe_handle,
44     mojo::Remote<mojom::Parser>* parser) {
45   parser->Bind(mojo::PendingRemote<mojom::Parser>(std::move(pipe_handle), 0));
46   parser->set_disconnect_handler(std::move(connection_error_handler_));
47 }
48 
TakeParserRemote()49 RemoteParserPtr ParserSandboxSetupHooks::TakeParserRemote() {
50   return std::move(parser_);
51 }
52 
SpawnParserSandbox(scoped_refptr<MojoTaskRunner> mojo_task_runner,const SandboxConnectionErrorCallback & connection_error_callback,RemoteParserPtr * parser)53 ResultCode SpawnParserSandbox(
54     scoped_refptr<MojoTaskRunner> mojo_task_runner,
55     const SandboxConnectionErrorCallback& connection_error_callback,
56     RemoteParserPtr* parser) {
57   auto error_handler =
58       base::BindOnce(connection_error_callback, SandboxType::kParser);
59   ParserSandboxSetupHooks setup_hooks(mojo_task_runner,
60                                       std::move(error_handler));
61   ResultCode result_code = SpawnSandbox(&setup_hooks, SandboxType::kParser);
62   *parser = setup_hooks.TakeParserRemote();
63 
64   return result_code;
65 }
66 
67 }  // namespace chrome_cleaner
68