OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Note: any code in this file MUST be async-signal safe. | 5 // Note: any code in this file MUST be async-signal safe. |
6 | 6 |
7 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" | 7 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" |
8 | 8 |
9 #include <unistd.h> | 9 #include <unistd.h> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/posix/eintr_wrapper.h" | 12 #include "base/posix/eintr_wrapper.h" |
13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
14 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" | 14 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
15 | 15 |
16 #define SECCOMP_MESSAGE_COMMON_CONTENT "seccomp-bpf failure" | |
17 #define SECCOMP_MESSAGE_CLONE_CONTENT "clone() failure" | |
18 #define SECCOMP_MESSAGE_PRCTL_CONTENT "prctl() failure" | |
19 #define SECCOMP_MESSAGE_IOCTL_CONTENT "ioctl() failure" | |
20 | |
21 namespace { | 16 namespace { |
22 | 17 |
23 inline bool IsArchitectureX86_64() { | 18 inline bool IsArchitectureX86_64() { |
24 #if defined(__x86_64__) | 19 #if defined(__x86_64__) |
25 return true; | 20 return true; |
26 #else | 21 #else |
27 return false; | 22 return false; |
28 #endif | 23 #endif |
29 } | 24 } |
30 | 25 |
(...skipping 21 matching lines...) Expand all Loading... |
52 const size_t kNumDigits = 4; | 47 const size_t kNumDigits = 4; |
53 char sysno_base10[kNumDigits]; | 48 char sysno_base10[kNumDigits]; |
54 uint32_t rem = sysno; | 49 uint32_t rem = sysno; |
55 uint32_t mod = 0; | 50 uint32_t mod = 0; |
56 for (int i = kNumDigits - 1; i >= 0; i--) { | 51 for (int i = kNumDigits - 1; i >= 0; i--) { |
57 mod = rem % 10; | 52 mod = rem % 10; |
58 rem /= 10; | 53 rem /= 10; |
59 sysno_base10[i] = '0' + mod; | 54 sysno_base10[i] = '0' + mod; |
60 } | 55 } |
61 static const char kSeccompErrorPrefix[] = | 56 static const char kSeccompErrorPrefix[] = |
62 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_COMMON_CONTENT " in syscall "; | 57 __FILE__":**CRASHING**:seccomp-bpf failure in syscall "; |
63 static const char kSeccompErrorPostfix[] = "\n"; | 58 static const char kSeccompErrorPostfix[] = "\n"; |
64 WriteToStdErr(kSeccompErrorPrefix, sizeof(kSeccompErrorPrefix) - 1); | 59 WriteToStdErr(kSeccompErrorPrefix, sizeof(kSeccompErrorPrefix) - 1); |
65 WriteToStdErr(sysno_base10, sizeof(sysno_base10)); | 60 WriteToStdErr(sysno_base10, sizeof(sysno_base10)); |
66 WriteToStdErr(kSeccompErrorPostfix, sizeof(kSeccompErrorPostfix) - 1); | 61 WriteToStdErr(kSeccompErrorPostfix, sizeof(kSeccompErrorPostfix) - 1); |
67 } | 62 } |
68 | 63 |
69 } // namespace. | 64 } // namespace. |
70 | 65 |
71 namespace sandbox { | 66 namespace sandbox { |
72 | 67 |
(...skipping 20 matching lines...) Expand all Loading... |
93 addr = reinterpret_cast<volatile char*>(syscall); | 88 addr = reinterpret_cast<volatile char*>(syscall); |
94 *addr = '\0'; | 89 *addr = '\0'; |
95 for (;;) | 90 for (;;) |
96 _exit(1); | 91 _exit(1); |
97 } | 92 } |
98 | 93 |
99 // TODO(jln): refactor the reporting functions. | 94 // TODO(jln): refactor the reporting functions. |
100 | 95 |
101 intptr_t SIGSYSCloneFailure(const struct arch_seccomp_data& args, void* aux) { | 96 intptr_t SIGSYSCloneFailure(const struct arch_seccomp_data& args, void* aux) { |
102 static const char kSeccompCloneError[] = | 97 static const char kSeccompCloneError[] = |
103 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_CLONE_CONTENT "\n"; | 98 __FILE__":**CRASHING**:clone() failure\n"; |
104 WriteToStdErr(kSeccompCloneError, sizeof(kSeccompCloneError) - 1); | 99 WriteToStdErr(kSeccompCloneError, sizeof(kSeccompCloneError) - 1); |
105 // "flags" is the first argument in the kernel's clone(). | 100 // "flags" is the first argument in the kernel's clone(). |
106 // Mark as volatile to be able to find the value on the stack in a minidump. | 101 // Mark as volatile to be able to find the value on the stack in a minidump. |
107 volatile uint64_t clone_flags = args.args[0]; | 102 volatile uint64_t clone_flags = args.args[0]; |
108 volatile char* addr; | 103 volatile char* addr; |
109 if (IsArchitectureX86_64()) { | 104 if (IsArchitectureX86_64()) { |
110 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFFFFF); | 105 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFFFFF); |
111 *addr = '\0'; | 106 *addr = '\0'; |
112 } | 107 } |
113 // Hit the NULL page if this fails to fault. | 108 // Hit the NULL page if this fails to fault. |
114 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFF); | 109 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFF); |
115 *addr = '\0'; | 110 *addr = '\0'; |
116 for (;;) | 111 for (;;) |
117 _exit(1); | 112 _exit(1); |
118 } | 113 } |
119 | 114 |
120 intptr_t SIGSYSPrctlFailure(const struct arch_seccomp_data& args, | 115 intptr_t SIGSYSPrctlFailure(const struct arch_seccomp_data& args, |
121 void* /* aux */) { | 116 void* /* aux */) { |
122 static const char kSeccompPrctlError[] = | 117 static const char kSeccompPrctlError[] = |
123 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_PRCTL_CONTENT "\n"; | 118 __FILE__":**CRASHING**:prctl() failure\n"; |
124 WriteToStdErr(kSeccompPrctlError, sizeof(kSeccompPrctlError) - 1); | 119 WriteToStdErr(kSeccompPrctlError, sizeof(kSeccompPrctlError) - 1); |
125 // Mark as volatile to be able to find the value on the stack in a minidump. | 120 // Mark as volatile to be able to find the value on the stack in a minidump. |
126 volatile uint64_t option = args.args[0]; | 121 volatile uint64_t option = args.args[0]; |
127 volatile char* addr = | 122 volatile char* addr = |
128 reinterpret_cast<volatile char*>(option & 0xFFF); | 123 reinterpret_cast<volatile char*>(option & 0xFFF); |
129 *addr = '\0'; | 124 *addr = '\0'; |
130 for (;;) | 125 for (;;) |
131 _exit(1); | 126 _exit(1); |
132 } | 127 } |
133 | 128 |
134 intptr_t SIGSYSIoctlFailure(const struct arch_seccomp_data& args, | 129 intptr_t SIGSYSIoctlFailure(const struct arch_seccomp_data& args, |
135 void* /* aux */) { | 130 void* /* aux */) { |
136 static const char kSeccompIoctlError[] = | 131 static const char kSeccompIoctlError[] = |
137 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_IOCTL_CONTENT "\n"; | 132 __FILE__":**CRASHING**:ioctl() failure\n"; |
138 WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1); | 133 WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1); |
139 // Make "request" volatile so that we can see it on the stack in a minidump. | 134 // Make "request" volatile so that we can see it on the stack in a minidump. |
140 volatile uint64_t request = args.args[1]; | 135 volatile uint64_t request = args.args[1]; |
141 volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF); | 136 volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF); |
142 *addr = '\0'; | 137 *addr = '\0'; |
143 // Hit the NULL page if this fails. | 138 // Hit the NULL page if this fails. |
144 addr = reinterpret_cast<volatile char*>(request & 0xFFF); | 139 addr = reinterpret_cast<volatile char*>(request & 0xFFF); |
145 *addr = '\0'; | 140 *addr = '\0'; |
146 for (;;) | 141 for (;;) |
147 _exit(1); | 142 _exit(1); |
148 } | 143 } |
149 | 144 |
150 const char* GetErrorMessageContentForTests() { | |
151 return SECCOMP_MESSAGE_COMMON_CONTENT; | |
152 } | |
153 | |
154 const char* GetCloneErrorMessageContentForTests() { | |
155 return SECCOMP_MESSAGE_CLONE_CONTENT; | |
156 } | |
157 | |
158 const char* GetPrctlErrorMessageContentForTests() { | |
159 return SECCOMP_MESSAGE_PRCTL_CONTENT; | |
160 } | |
161 | |
162 const char* GetIoctlErrorMessageContentForTests() { | |
163 return SECCOMP_MESSAGE_IOCTL_CONTENT; | |
164 } | |
165 | |
166 } // namespace sandbox. | 145 } // namespace sandbox. |
OLD | NEW |