summaryrefslogtreecommitdiffstats
path: root/sandbox/linux
diff options
context:
space:
mode:
authorjln@chromium.org <jln@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-26 18:11:05 +0000
committerjln@chromium.org <jln@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-26 18:11:05 +0000
commit1f69ba353cc45d78797d610dc409dd388879d935 (patch)
tree8f7aa2b2070fe543708784d94576f50e2deb536b /sandbox/linux
parentc5b93afb254f8e758572cfb20c5bc87d43c1efa0 (diff)
downloadchromium_src-1f69ba353cc45d78797d610dc409dd388879d935.zip
chromium_src-1f69ba353cc45d78797d610dc409dd388879d935.tar.gz
chromium_src-1f69ba353cc45d78797d610dc409dd388879d935.tar.bz2
Seccomp BPF: add a unittest for a SIGSYS handler
BUG=None TEST=None Review URL: https://chromiumcodereview.appspot.com/10666032 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144210 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sandbox/linux')
-rw-r--r--sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
index aa2c114..a661c8d 100644
--- a/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc
@@ -146,4 +146,56 @@ TEST(SandboxBpf, ApplyBasicWhitelistPolicy) {
TryPolicyInProcess(WhitelistGetpidPolicy, GetpidProcess);
}
+// A simple blacklist policy, with a SIGSYS handler
+
+// TODO: provide an API to provide the auxiliary data pointer
+// to the evaluator
+
+static int BlacklistNanosleepPolicySigsysAuxData;
+
+intptr_t EnomemHandler(const struct arch_seccomp_data& args, void *aux) {
+ // We also check that the auxiliary data is correct
+ if (!aux)
+ ExitGroup(1);
+ *(static_cast<int*>(aux)) = kExpectedReturnValue;
+ return -ENOMEM;
+}
+
+Sandbox::ErrorCode BlacklistNanosleepPolicySigsys(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
+ return ENOSYS;
+ }
+ switch (sysno) {
+ case __NR_nanosleep:
+ return Sandbox::ErrorCode(EnomemHandler,
+ static_cast<void *>(&BlacklistNanosleepPolicySigsysAuxData));
+ default:
+ return Sandbox::SB_ALLOWED;
+ }
+}
+
+void NanosleepProcessSigsys(void) {
+ const struct timespec ts = {0, 0};
+ errno = 0;
+ // getpid() should work properly
+ if (syscall(__NR_getpid) < 0)
+ ExitGroup(1);
+ // Our Auxiliary Data, should be reset by the signal handler
+ BlacklistNanosleepPolicySigsysAuxData = -1;
+ errno = 0;
+ if (syscall(__NR_nanosleep, &ts, NULL) != -1 || errno != ENOMEM)
+ ExitGroup(1);
+ // We expect the signal handler to modify AuxData
+ if (BlacklistNanosleepPolicySigsysAuxData != kExpectedReturnValue)
+ ExitGroup(1);
+ else
+ ExitGroup(kExpectedReturnValue);
+}
+
+TEST(SandboxBpf, BasicBlacklistWithSigsys) {
+ TryPolicyInProcess(BlacklistNanosleepPolicySigsys, NanosleepProcessSigsys);
+}
+
} // namespace