| Index: sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
|
| diff --git a/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc b/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..42f84de39e85332e3e57447b4da3a7cf00df0ee7
|
| --- /dev/null
|
| +++ b/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
|
| @@ -0,0 +1,126 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
|
| +#include "sandbox/linux/seccomp-bpf/syscall_iterator.h"
|
| +#include "sandbox/linux/tests/unit_tests.h"
|
| +
|
| +using namespace playground2;
|
| +
|
| +namespace {
|
| +
|
| +SANDBOX_TEST(SyscallIterator, Monotonous) {
|
| + for (int i = 0; i < 2; ++i) {
|
| + SyscallIterator iter(!i);
|
| + uint32_t next = iter.Next();
|
| + if (i || MIN_SYSCALL != 0) {
|
| + SANDBOX_ASSERT(next == 0);
|
| + }
|
| + for (uint32_t last = next; !iter.Done(); last = next) {
|
| + next = iter.Next();
|
| + SANDBOX_ASSERT(last < next);
|
| + }
|
| + SANDBOX_ASSERT(next == 0xFFFFFFFFu);
|
| + }
|
| +}
|
| +
|
| +SANDBOX_TEST(SyscallIterator, SyscallRange) {
|
| + SyscallIterator iter(false);
|
| + uint32_t next = iter.Next();
|
| + while (next < std::max(MIN_SYSCALL, 1u)-1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == std::max(MIN_SYSCALL, 1u)-1);
|
| + for (uint32_t last = next; next < MAX_PUBLIC_SYSCALL+1; last = next) {
|
| + SANDBOX_ASSERT((next = iter.Next()) == last+1);
|
| + }
|
| + SANDBOX_ASSERT(next == MAX_PUBLIC_SYSCALL+1);
|
| +}
|
| +
|
| +#if defined(__i386__) || defined(__x86_64__)
|
| +SANDBOX_TEST(SyscallIterator, X32) {
|
| + SyscallIterator iter(false);
|
| + uint32_t next = iter.Next();
|
| + while (next < std::max(MIN_SYSCALL^0x40000000u, 1u)-1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == std::max(MIN_SYSCALL^0x40000000u, 1u)-1);
|
| + for (uint32_t last = next; next < (MAX_SYSCALL^0x40000000u)+1; last = next) {
|
| + SANDBOX_ASSERT((next = iter.Next()) == last+1);
|
| + }
|
| + SANDBOX_ASSERT(next == (MAX_SYSCALL^0x40000000u)+1);
|
| +}
|
| +#endif
|
| +
|
| +#if defined(__arm__)
|
| +SANDBOX_TEST(SyscallIterator, ARMPrivate) {
|
| + SyscallIterator iter(false);
|
| + uint32_t next = iter.Next();
|
| + while (next < MIN_PRIVATE_SYSCALL-1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == MIN_PRIVATE_SYSCALL-1);
|
| + for (uint32_t last = next; next < MAX_PRIVATE_SYSCALL+1; last = next) {
|
| + SANDBOX_ASSERT((next = iter.Next()) == last+1);
|
| + }
|
| + SANDBOX_ASSERT(next == MAX_PRIVATE_SYSCALL+1);
|
| +}
|
| +
|
| +SANDBOX_TEST(SyscallIterator, ARMHidden) {
|
| + SyscallIterator iter(false);
|
| + uint32_t next = iter.Next();
|
| + while (next < MIN_GHOST_SYSCALL-1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == MIN_GHOST_SYSCALL-1);
|
| + for (uint32_t last = next; next < MAX_SYSCALL+1; last = next) {
|
| + SANDBOX_ASSERT((next = iter.Next()) == last+1);
|
| + }
|
| + SANDBOX_ASSERT(next == MAX_SYSCALL+1);
|
| +}
|
| +#endif
|
| +
|
| +SANDBOX_TEST(SyscallIterator, Invalid) {
|
| + for (int i = 0; i < 2; ++i) {
|
| + SyscallIterator iter(!i);
|
| + uint32_t next = iter.Next();
|
| + if (i || MIN_SYSCALL != 0) {
|
| + SANDBOX_ASSERT(next == 0);
|
| + }
|
| + if (MIN_SYSCALL > 1) {
|
| + while (next < MIN_SYSCALL-1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == MIN_SYSCALL-1);
|
| + }
|
| + while (next < MAX_SYSCALL+1) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == MAX_SYSCALL+1);
|
| + while (next < 0x7FFFFFFFu) {
|
| + next = iter.Next();
|
| + }
|
| + SANDBOX_ASSERT(next == 0x7FFFFFFFu);
|
| + next = iter.Next();
|
| + SANDBOX_ASSERT(next == 0x80000000u);
|
| + SANDBOX_ASSERT(!iter.Done());
|
| + next = iter.Next();
|
| + SANDBOX_ASSERT( iter.Done());
|
| + SANDBOX_ASSERT(next == 0xFFFFFFFFu);
|
| + }
|
| +}
|
| +
|
| +SANDBOX_TEST(SyscallIterator, InvalidOnly) {
|
| + for (SyscallIterator iter(true); !iter.Done(); ) {
|
| + uint32_t next = iter.Next();
|
| + SANDBOX_ASSERT(next < MIN_SYSCALL || next > MAX_PUBLIC_SYSCALL);
|
| +#if defined(__arm__)
|
| + SANDBOX_ASSERT(next < MIN_PRIVATE_SYSCALL || next > MAX_PRIVATE_SYSCALL);
|
| + SANDBOX_ASSERT(next < MIN_GHOST_SYSCALL || next > MAX_SYSCALL);
|
| +#endif
|
| + }
|
| +
|
| +}
|
| +
|
| +} // namespace
|
|
|