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

Unified Diff: sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc

Issue 11096012: Add a platform-specific syscall number iterator. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fixed upload. Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
index 1422b5918d9a2d875bd5366a30f27a365995ac16..1079a4fa81a5d0f578e573954619059b8b1bcb21 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
@@ -41,11 +41,11 @@ SANDBOX_TEST(SandboxBpf, CallSupportsTwice) {
// A simple blacklist test
ErrorCode BlacklistNanosleepPolicy(int sysno) {
- if (sysno < static_cast<int>(MIN_SYSCALL) ||
- sysno > static_cast<int>(MAX_SYSCALL)) {
+ if (!Sandbox::isValidSyscallNumber(sysno)) {
// FIXME: we should really not have to do that in a trivial policy
return ErrorCode(ENOSYS);
}
+
switch (sysno) {
case __NR_nanosleep:
return ErrorCode(EACCES);
@@ -100,11 +100,11 @@ intptr_t EnomemHandler(const struct arch_seccomp_data& args, void *aux) {
}
ErrorCode BlacklistNanosleepPolicySigsys(int sysno) {
- if (sysno < static_cast<int>(MIN_SYSCALL) ||
- sysno > static_cast<int>(MAX_SYSCALL)) {
+ if (!Sandbox::isValidSyscallNumber(sysno)) {
// FIXME: we should really not have to do that in a trivial policy
return ErrorCode(ENOSYS);
}
+
switch (sysno) {
case __NR_nanosleep:
return Sandbox::Trap(EnomemHandler,
@@ -148,16 +148,16 @@ int SysnoToRandomErrno(int sysno) {
}
ErrorCode SyntheticPolicy(int sysno) {
- if (sysno < static_cast<int>(MIN_SYSCALL) ||
- sysno > static_cast<int>(MAX_SYSCALL)) {
- // FIXME: we should really not have to do that in a trivial policy.
+ if (!Sandbox::isValidSyscallNumber(sysno)) {
+ // FIXME: we should really not have to do that in a trivial policy
return ErrorCode(ENOSYS);
}
- // TODO(jorgelo): remove this restriction once crbug.com/141694 is fixed.
+// TODO(jorgelo): remove this once the new code generator lands.
#if defined(__arm__)
- if (sysno > kArmPublicSysnoCeiling)
+ if (sysno > static_cast<int>(MAX_PUBLIC_SYSCALL)) {
return ErrorCode(ENOSYS);
+ }
#endif
// TODO(markus): allow calls to write(). This should start working as soon
@@ -177,17 +177,10 @@ BPF_TEST(SandboxBpf, SyntheticPolicy, SyntheticPolicy) {
// overflow.
BPF_ASSERT(
std::numeric_limits<int>::max() - kExpectedReturnValue - 1 >=
- static_cast<int>(MAX_SYSCALL));
-
- // TODO(jorgelo): remove this limit once crbug.com/141694 is fixed.
-#if defined(__arm__)
- const int sysno_ceiling = kArmPublicSysnoCeiling;
-#else
- const int sysno_ceiling = static_cast<int>(MAX_SYSCALL);
-#endif
+ static_cast<int>(MAX_PUBLIC_SYSCALL));
for (int syscall_number = static_cast<int>(MIN_SYSCALL);
- syscall_number <= sysno_ceiling;
+ syscall_number <= static_cast<int>(MAX_PUBLIC_SYSCALL);
++syscall_number) {
if (syscall_number == __NR_exit_group ||
syscall_number == __NR_write) {
@@ -200,4 +193,44 @@ BPF_TEST(SandboxBpf, SyntheticPolicy, SyntheticPolicy) {
}
}
+#if defined(__arm__)
+// A simple policy that tests whether ARM private system calls are supported
+// by our BPF compiler and by the BPF interpreter in the kernel.
+
+// For ARM private system calls, return an errno equal to their offset from
+// __ARM_NR_BASE plus 1 (to avoid NUL errno).
jln (very slow on Chromium) 2012/10/12 20:26:52 You mean offset from MIN_PRIVATE_SYSCALL, no ?
Jorge Lucangeli Obes 2012/10/13 01:39:30 It's the same thing: #define MIN_PRIVATE_SYSCALL (
+int ArmPrivateSysnoToErrno(int sysno) {
+ if (sysno >= static_cast<int>(MIN_PRIVATE_SYSCALL) &&
+ sysno <= static_cast<int>(MAX_PRIVATE_SYSCALL)) {
+ return (sysno - MIN_PRIVATE_SYSCALL) + 1;
+ } else {
+ return ENOSYS;
+ }
+}
+
+ErrorCode ArmPrivatePolicy(int sysno) {
jln (very slow on Chromium) 2012/10/12 20:26:52 I'm a bit worried that this wouldn't be a viable p
Jorge Lucangeli Obes 2012/10/13 01:39:30 Done.
+ if (!Sandbox::isValidSyscallNumber(sysno)) {
+ // FIXME: we should really not have to do that in a trivial policy.
+ return ErrorCode(ENOSYS);
+ }
+
+ if (sysno >= static_cast<int>(MIN_PRIVATE_SYSCALL) &&
+ sysno <= static_cast<int>(MAX_PRIVATE_SYSCALL)) {
+ return ErrorCode(ArmPrivateSysnoToErrno(sysno));
+ } else {
+ return ErrorCode(ErrorCode::ERR_ALLOWED);
+ }
+}
+
+BPF_TEST(SandboxBpf, ArmPrivatePolicy, ArmPrivatePolicy) {
+ for (int syscall_number = static_cast<int>(MIN_PRIVATE_SYSCALL);
+ syscall_number <= static_cast<int>(MAX_PRIVATE_SYSCALL);
+ ++syscall_number) {
+ errno = 0;
+ BPF_ASSERT(syscall(syscall_number) == -1);
+ BPF_ASSERT(errno == ArmPrivateSysnoToErrno(syscall_number));
+ }
+}
+#endif // defined(__arm__)
+
} // namespace

Powered by Google App Engine
This is Rietveld 408576698