File: SandboxProfilerParent.h

package info (click to toggle)
firefox-esr 140.4.0esr-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie-proposed-updates
  • size: 4,539,284 kB
  • sloc: cpp: 7,381,286; javascript: 6,388,710; ansic: 3,710,139; python: 1,393,780; xml: 628,165; asm: 426,916; java: 184,004; sh: 65,742; makefile: 19,302; objc: 13,059; perl: 12,912; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,226; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (87 lines) | stat: -rw-r--r-- 2,838 bytes parent folder | download | duplicates (13)
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
80
81
82
83
84
85
86
87
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

#ifndef SANDBOX_PROFILER_PARENT_H
#define SANDBOX_PROFILER_PARENT_H

#include "SandboxProfiler.h"
#include "SandboxInfo.h"

#if defined(HAVE_REPORT_UPROFILER_CHILD)
#error Cannot include SandboxProfilerParent.h when already included SandboxProfilerChild.h
#endif

#define HAVE_REPORT_UPROFILER_PARENT

namespace mozilla {

struct UprofilerFuncPtrs uprofiler = {
    .register_thread = uprofiler_register_thread,
    .unregister_thread = uprofiler_unregister_thread,
    .simple_event_marker = uprofiler_simple_event_marker,
    .simple_event_marker_capture_stack =
        uprofiler_simple_event_marker_capture_stack,
    .simple_event_marker_with_stack = uprofiler_simple_event_marker_with_stack,
    .backtrace_into_buffer = uprofiler_backtrace_into_buffer,
    .native_backtrace = uprofiler_native_backtrace,
    .is_active = uprofiler_is_active,
    .feature_active = uprofiler_feature_active,
};

bool uprofiler_initted = true;

#if defined(DEBUG)
// On the parent side there is no sandbox so calls don't have to care about that
thread_local Atomic<bool> sInSignalContext = Atomic<bool>(false);
#endif  // defined(DEBUG)

/* static */
void SandboxProfiler::ReportAudit(const char* aKind, const char* aOp,
                                  int aFlags, uint64_t aId, int aPerms,
                                  const char* aPath, pid_t aPid) {
  if (!Active()) {
    return;
  }

  std::array arg_names = {"id", "op", "rflags", "path", "pid"};
  std::array arg_types = {
      TRACE_VALUE_TYPE_UINT,    // id
      TRACE_VALUE_TYPE_STRING,  // op
      TRACE_VALUE_TYPE_UINT,    // rflags
      TRACE_VALUE_TYPE_STRING,  // path
      TRACE_VALUE_TYPE_UINT     // pid
  };

  std::array arg_values = {static_cast<unsigned long long>(aId),
                           reinterpret_cast<unsigned long long>(aOp),
                           static_cast<unsigned long long>(aFlags),
                           reinterpret_cast<unsigned long long>(aPath),
                           static_cast<unsigned long long>(aPid)};

  Report(aKind, arg_names, arg_types, arg_values, nullptr);
}

/*  static */
void SandboxProfiler::ReportLog(const char* buf) {
  if (!Active()) {
    return;
  }

  if (!SandboxInfo::Get().Test(SandboxInfo::kVerbose) &&
      !SandboxInfo::Get().Test(SandboxInfo::kVerboseTests)) {
    return;
  }

  std::array arg_names = {"log"};
  std::array arg_types = {
      TRACE_VALUE_TYPE_STRING,
  };
  std::array arg_values = {reinterpret_cast<unsigned long long>(buf)};

  Report("SandboxBroker::Log", arg_names, arg_types, arg_values, nullptr);
}

}  // namespace mozilla

#endif  // SANDBOX_PROFILER_PARENT_H