blob: bd7f6820c33c81f97736b8d28afb06aeed5a08fe [file] [log] [blame]
// Copyright 2016 The Fuchsia 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 <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <zircon/zx-syscall-numbers.h>
#include <zircon/syscalls.h>
#include <unittest/unittest.h>
extern zx_status_t bad_syscall(uint64_t num);
bool bad_access_test(void) {
BEGIN_TEST;
void* unmapped_addr = (void*)4096;
zx_handle_t h[2];
EXPECT_EQ(zx_channel_create(0, h, h + 1),
0, "Error: channel create failed");
EXPECT_LT(zx_channel_write(0, h[0], unmapped_addr, 1, NULL, 0),
0, "Error: reading unmapped addr");
EXPECT_LT(zx_channel_write(h[0], 0, (void*)KERNEL_ASPACE_BASE - 1, 5, NULL, 0),
0, "Error: read crossing kernel boundary");
EXPECT_LT(zx_channel_write(h[0], 0, (void*)KERNEL_ASPACE_BASE, 1, NULL, 0),
0, "Error: read into kernel space");
EXPECT_EQ(zx_channel_write(h[0], 0, (void*)&unmapped_addr, sizeof(void*), NULL, 0),
0, "Good syscall failed");
END_TEST;
}
static void try_bad_syscall(void* arg) {
uint64_t num = (uintptr_t)arg;
zx_status_t status = bad_syscall(num);
UNITTEST_FAIL_TRACEF("bad syscall %#" PRIx64 " returned %d", num, status);
}
#define TRY_BAD_SYSCALL(num) \
ASSERT_DEATH(try_bad_syscall, (void*)(uintptr_t)(num), \
"bad syscall did not crash")
bool bad_syscall_num_test(void) {
BEGIN_TEST;
TRY_BAD_SYSCALL(ZX_SYS_COUNT);
TRY_BAD_SYSCALL(0x80000000ull);
TRY_BAD_SYSCALL(0xff00ff0000000000ull);
TRY_BAD_SYSCALL(0xff00ff0000000010ull);
END_TEST;
}
BEGIN_TEST_CASE(bad_syscall_tests)
RUN_TEST(bad_access_test)
RUN_TEST(bad_syscall_num_test)
END_TEST_CASE(bad_syscall_tests)
#ifndef BUILD_COMBINED_TESTS
int main(int argc, char** argv) {
return unittest_run_all_tests(argc, argv) ? 0 : -1;
}
#endif