Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc

Issue 196793023: Add seccomp sandbox for non-SFI NaCl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
16 namespace { 21 namespace {
17 22
18 inline bool IsArchitectureX86_64() { 23 inline bool IsArchitectureX86_64() {
19 #if defined(__x86_64__) 24 #if defined(__x86_64__)
20 return true; 25 return true;
21 #else 26 #else
22 return false; 27 return false;
23 #endif 28 #endif
24 } 29 }
25 30
(...skipping 21 matching lines...) Expand all
47 const size_t kNumDigits = 4; 52 const size_t kNumDigits = 4;
48 char sysno_base10[kNumDigits]; 53 char sysno_base10[kNumDigits];
49 uint32_t rem = sysno; 54 uint32_t rem = sysno;
50 uint32_t mod = 0; 55 uint32_t mod = 0;
51 for (int i = kNumDigits - 1; i >= 0; i--) { 56 for (int i = kNumDigits - 1; i >= 0; i--) {
52 mod = rem % 10; 57 mod = rem % 10;
53 rem /= 10; 58 rem /= 10;
54 sysno_base10[i] = '0' + mod; 59 sysno_base10[i] = '0' + mod;
55 } 60 }
56 static const char kSeccompErrorPrefix[] = 61 static const char kSeccompErrorPrefix[] =
57 __FILE__":**CRASHING**:seccomp-bpf failure in syscall "; 62 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_COMMON_CONTENT " in syscall ";
58 static const char kSeccompErrorPostfix[] = "\n"; 63 static const char kSeccompErrorPostfix[] = "\n";
59 WriteToStdErr(kSeccompErrorPrefix, sizeof(kSeccompErrorPrefix) - 1); 64 WriteToStdErr(kSeccompErrorPrefix, sizeof(kSeccompErrorPrefix) - 1);
60 WriteToStdErr(sysno_base10, sizeof(sysno_base10)); 65 WriteToStdErr(sysno_base10, sizeof(sysno_base10));
61 WriteToStdErr(kSeccompErrorPostfix, sizeof(kSeccompErrorPostfix) - 1); 66 WriteToStdErr(kSeccompErrorPostfix, sizeof(kSeccompErrorPostfix) - 1);
62 } 67 }
63 68
64 } // namespace. 69 } // namespace.
65 70
66 namespace sandbox { 71 namespace sandbox {
67 72
(...skipping 20 matching lines...) Expand all
88 addr = reinterpret_cast<volatile char*>(syscall); 93 addr = reinterpret_cast<volatile char*>(syscall);
89 *addr = '\0'; 94 *addr = '\0';
90 for (;;) 95 for (;;)
91 _exit(1); 96 _exit(1);
92 } 97 }
93 98
94 // TODO(jln): refactor the reporting functions. 99 // TODO(jln): refactor the reporting functions.
95 100
96 intptr_t SIGSYSCloneFailure(const struct arch_seccomp_data& args, void* aux) { 101 intptr_t SIGSYSCloneFailure(const struct arch_seccomp_data& args, void* aux) {
97 static const char kSeccompCloneError[] = 102 static const char kSeccompCloneError[] =
98 __FILE__":**CRASHING**:clone() failure\n"; 103 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_CLONE_CONTENT "\n";
99 WriteToStdErr(kSeccompCloneError, sizeof(kSeccompCloneError) - 1); 104 WriteToStdErr(kSeccompCloneError, sizeof(kSeccompCloneError) - 1);
100 // "flags" is the first argument in the kernel's clone(). 105 // "flags" is the first argument in the kernel's clone().
101 // Mark as volatile to be able to find the value on the stack in a minidump. 106 // Mark as volatile to be able to find the value on the stack in a minidump.
102 volatile uint64_t clone_flags = args.args[0]; 107 volatile uint64_t clone_flags = args.args[0];
103 volatile char* addr; 108 volatile char* addr;
104 if (IsArchitectureX86_64()) { 109 if (IsArchitectureX86_64()) {
105 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFFFFF); 110 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFFFFF);
106 *addr = '\0'; 111 *addr = '\0';
107 } 112 }
108 // Hit the NULL page if this fails to fault. 113 // Hit the NULL page if this fails to fault.
109 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFF); 114 addr = reinterpret_cast<volatile char*>(clone_flags & 0xFFF);
110 *addr = '\0'; 115 *addr = '\0';
111 for (;;) 116 for (;;)
112 _exit(1); 117 _exit(1);
113 } 118 }
114 119
115 intptr_t SIGSYSPrctlFailure(const struct arch_seccomp_data& args, 120 intptr_t SIGSYSPrctlFailure(const struct arch_seccomp_data& args,
116 void* /* aux */) { 121 void* /* aux */) {
117 static const char kSeccompPrctlError[] = 122 static const char kSeccompPrctlError[] =
118 __FILE__":**CRASHING**:prctl() failure\n"; 123 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_PRCTL_CONTENT "\n";
119 WriteToStdErr(kSeccompPrctlError, sizeof(kSeccompPrctlError) - 1); 124 WriteToStdErr(kSeccompPrctlError, sizeof(kSeccompPrctlError) - 1);
120 // Mark as volatile to be able to find the value on the stack in a minidump. 125 // Mark as volatile to be able to find the value on the stack in a minidump.
121 volatile uint64_t option = args.args[0]; 126 volatile uint64_t option = args.args[0];
122 volatile char* addr = 127 volatile char* addr =
123 reinterpret_cast<volatile char*>(option & 0xFFF); 128 reinterpret_cast<volatile char*>(option & 0xFFF);
124 *addr = '\0'; 129 *addr = '\0';
125 for (;;) 130 for (;;)
126 _exit(1); 131 _exit(1);
127 } 132 }
128 133
129 intptr_t SIGSYSIoctlFailure(const struct arch_seccomp_data& args, 134 intptr_t SIGSYSIoctlFailure(const struct arch_seccomp_data& args,
130 void* /* aux */) { 135 void* /* aux */) {
131 static const char kSeccompIoctlError[] = 136 static const char kSeccompIoctlError[] =
132 __FILE__":**CRASHING**:ioctl() failure\n"; 137 __FILE__":**CRASHING**:" SECCOMP_MESSAGE_IOCTL_CONTENT "\n";
133 WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1); 138 WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1);
134 // Make "request" volatile so that we can see it on the stack in a minidump. 139 // Make "request" volatile so that we can see it on the stack in a minidump.
135 volatile uint64_t request = args.args[1]; 140 volatile uint64_t request = args.args[1];
136 volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF); 141 volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF);
137 *addr = '\0'; 142 *addr = '\0';
138 // Hit the NULL page if this fails. 143 // Hit the NULL page if this fails.
139 addr = reinterpret_cast<volatile char*>(request & 0xFFF); 144 addr = reinterpret_cast<volatile char*>(request & 0xFFF);
140 *addr = '\0'; 145 *addr = '\0';
141 for (;;) 146 for (;;)
142 _exit(1); 147 _exit(1);
143 } 148 }
144 149
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
145 } // namespace sandbox. 166 } // namespace sandbox.
OLDNEW
« no previous file with comments | « sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h ('k') | sandbox/linux/seccomp-bpf/bpf_tests.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698