admin
2023-03-07 8b06b1cbf112d55307ea8a6efe711db4e7506d89
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright 2017 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
 
#ifndef CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_
#define CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_
 
#include <errno.h>
#include <signal.h>
#include <stdint.h>
#include <sys/types.h>
 
#include "base/macros.h"
#include "build/build_config.h"
#include "util/file/file_io.h"
#include "util/misc/address_types.h"
 
namespace crashpad {
 
class ExceptionHandlerProtocol {
 public:
#pragma pack(push, 1)
 
  //! \brief The type used for error reporting.
  using Errno = int32_t;
  static_assert(sizeof(Errno) >= sizeof(errno), "Errno type is too small");
 
  //! \brief A boolean status suitable for communication between processes.
  enum Bool : char { kBoolFalse, kBoolTrue };
 
  //! \brief Information about a client registered with an
  //!     ExceptionHandlerServer.
  struct ClientInformation {
    //! \brief Constructs this object.
    ClientInformation();
 
    //! \brief The address in the client's address space of an
    //!     ExceptionInformation struct.
    VMAddress exception_information_address;
 
    //! \brief The address in the client's address space of a
    //!     SanitizationInformation struct, or 0 if there is no such struct.
    VMAddress sanitization_information_address;
 
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
    //! \brief Indicates that the client is likely in a crash loop if a crash
    //!     occurs before this timestamp. This value is only used by ChromeOS's
    //!     `/sbin/crash_reporter`.
    uint64_t crash_loop_before_time;
#endif
  };
 
  //! \brief The signal used to indicate a crash dump is complete.
  //!
  //! When multiple clients share a single socket connection with the handler,
  //! the handler sends this signal to the dump requestor to indicate when the
  //! the dump is either done or has failed and the client may continue.
  static constexpr int kDumpDoneSignal = SIGCONT;
 
  //! \brief The message passed from client to server.
  struct ClientToServerMessage {
    static constexpr int32_t kVersion = 1;
 
    //! \brief Constructs this object.
    ClientToServerMessage();
 
    //! \brief Indicates what message version is being used.
    int32_t version;
 
    enum Type : uint32_t {
      //! \brief Request that the server respond with its credentials.
      kTypeCheckCredentials,
 
      //! \brief Used to request a crash dump for the sending client.
      kTypeCrashDumpRequest
    };
 
    Type type;
 
    //! \brief A stack address of the thread sending the message.
    VMAddress requesting_thread_stack_address;
 
    union {
      //! \brief Valid for type == kCrashDumpRequest
      ClientInformation client_info;
    };
  };
 
  //! \brief The message passed from server to client.
  struct ServerToClientMessage {
    enum Type : uint32_t {
      //! \brief Used to pass credentials with `SCM_CREDENTIALS`.
      kTypeCredentials,
 
      //! \brief Indicates that the client should fork a PtraceBroker process.
      kTypeForkBroker,
 
      //! \brief Inidicates that the client should set allow the handler to
      //!     trace it using PR_SET_PTRACER.
      kTypeSetPtracer,
 
      //! \brief Indicates that the handler has completed a requested crash
      //!     dump.
      kTypeCrashDumpComplete,
 
      //! \brief Indicicates that the handler was unable to produce a crash
      //!     dump.
      kTypeCrashDumpFailed
    };
 
    Type type;
 
    //! \brief The handler's process ID. Valid for kTypeSetPtracer.
    pid_t pid;
  };
 
#pragma pack(pop)
 
  DISALLOW_IMPLICIT_CONSTRUCTORS(ExceptionHandlerProtocol);
};
 
}  // namespace crashpad
 
#endif  // CRASHPAD_UTIL_LINUX_EXCEPTION_HANDLER_PROTOCOL_H_