Index: sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc |
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc b/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc |
index d975d64ab0ef57f99ffb92e3f0a217d03579bd74..46c8be13580b4f5830355739df656501b991f278 100644 |
--- a/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc |
+++ b/sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc |
@@ -32,6 +32,9 @@ class Stubs { |
static int getpgid(pid_t pid) { return Syscall::Call(__NR_getpgid, pid); } |
static int setuid(uid_t uid) { return Syscall::Call(__NR_setuid, uid); } |
static int setgid(gid_t gid) { return Syscall::Call(__NR_setgid, gid); } |
+ static int setpgid(pid_t pid, pid_t pgid) { |
+ return Syscall::Call(__NR_setpgid, pid, pgid); |
+ } |
static int uname(struct utsname* buf) { |
return Syscall::Call(__NR_uname, buf); |
@@ -212,6 +215,10 @@ class MaskingPolicy : public SandboxBPFDSLPolicy { |
const Arg<gid_t> gid(0); |
return If((gid & 0xf0) == 0xf0, Error(EINVAL)).Else(Error(EACCES)); |
} |
+ if (sysno == __NR_setpgid) { |
+ const Arg<pid_t> pid(0); |
+ return If((pid & 0xa5) == 0xa0, Error(EINVAL)).Else(Error(EACCES)); |
+ } |
return Allow(); |
} |
@@ -229,6 +236,11 @@ BPF_TEST_C(BPFDSL, MaskTest, MaskingPolicy) { |
const int expect_errno = (gid & 0xf0) == 0xf0 ? EINVAL : EACCES; |
ASSERT_SYSCALL_RESULT(-expect_errno, setgid, gid); |
} |
+ |
+ for (pid_t pid = 0; pid < 0x100; ++pid) { |
+ const int expect_errno = (pid & 0xa5) == 0xa0 ? EINVAL : EACCES; |
+ ASSERT_SYSCALL_RESULT(-expect_errno, setpgid, pid, 0); |
+ } |
} |
class ElseIfPolicy : public SandboxBPFDSLPolicy { |