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