File: nacl_fork_delegate_linux.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (79 lines) | stat: -rw-r--r-- 2,802 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_
#define COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_

#include <memory>
#include <string>
#include <vector>

#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "content/public/common/zygote/zygote_fork_delegate_linux.h"

namespace base {
struct LaunchOptions;
}

namespace nacl {

// Appends any ZygoteForkDelegate instances needed by NaCl to |*delegates|.
void AddNaClZygoteForkDelegates(
    std::vector<std::unique_ptr<content::ZygoteForkDelegate>>* delegates);

// The NaClForkDelegate is created during Chrome linux zygote initialization,
// and provides "fork()" functionality with NaCl specific process
// characteristics (specifically address space layout) as an alternative to
// forking the zygote. A new delegate is passed in as an argument to
// ZygoteMain().
class NaClForkDelegate : public content::ZygoteForkDelegate {
 public:
  NaClForkDelegate();
  NaClForkDelegate(const NaClForkDelegate&) = delete;
  NaClForkDelegate& operator=(const NaClForkDelegate&) = delete;
  ~NaClForkDelegate() override;

  void Init(int sandboxdesc, bool enable_layer1_sandbox) override;
  void InitialUMA(std::string* uma_name,
                  int* uma_sample,
                  int* uma_boundary_value) override;
  bool CanHelp(const std::string& process_type,
               std::string* uma_name,
               int* uma_sample,
               int* uma_boundary_value) override;
  pid_t Fork(const std::string& process_type,
             const std::vector<std::string>& args,
             const std::vector<int>& fds,
             const std::string& channel_id) override;
  bool GetTerminationStatus(pid_t pid,
                            bool known_dead,
                            base::TerminationStatus* status,
                            int* exit_code) override;

 private:
  static void AddPassthroughEnvToOptions(base::LaunchOptions* options);

  // These values are reported via UMA and hence they become permanent
  // constants.  Old values cannot be reused, only new ones added.
  enum NaClHelperStatus {
    kNaClHelperUnused = 0,
    kNaClHelperMissing = 1,
    kNaClHelperBootstrapMissing = 2,
    // kNaClHelperValgrind = 3,  // Running in valgrind no longer supported.
    kNaClHelperLaunchFailed = 4,
    kNaClHelperAckFailed = 5,
    kNaClHelperSuccess = 6,
    kNaClHelperStatusBoundary  // Must be one greater than highest value used.
  };

  NaClHelperStatus status_;
  int fd_;

  FRIEND_TEST_ALL_PREFIXES(NaClForkDelegateLinuxTest, EnvPassthrough);
};

}  // namespace nacl

#endif  // COMPONENTS_NACL_ZYGOTE_NACL_FORK_DELEGATE_LINUX_H_