// 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 #include #include #include #include #include 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