| Index: tests/minsfi/test_pointer_conversion.c
|
| diff --git a/tests/minsfi/test_pointer_conversion.c b/tests/minsfi/test_pointer_conversion.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..74bc35c26b759f66c9cbbf8243a33b76f7fb6eb6
|
| --- /dev/null
|
| +++ b/tests/minsfi/test_pointer_conversion.c
|
| @@ -0,0 +1,96 @@
|
| +/*
|
| + * Copyright (c) 2014 The Native Client Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +/*
|
| + * These are simple unit tests which exercise the conversion between trusted
|
| + * and untrusted pointers in MinSFI.
|
| + */
|
| +
|
| +/*
|
| + * Tell the minsfi_ptr.h header to generate code which returns a magic value
|
| + * if an error is detected, rather than abort.
|
| + */
|
| +#define MINSFI_PTR_CONVERSION_TEST
|
| +
|
| +#include "native_client/src/include/minsfi_ptr.h"
|
| +#include "native_client/src/include/nacl_assert.h"
|
| +
|
| +static MinsfiSandbox sb;
|
| +static sfiptr_t untrusted_ptr;
|
| +static char *native_ptr;
|
| +
|
| +void test_from_ptr_masks_pointer(void) {
|
| + sb.mem_base = (char*) 0x00000000;
|
| + sb.ptr_mask = (sfiptr_t) 0x0000FFFF;
|
| +
|
| + untrusted_ptr = (sfiptr_t) 0xABCDEF12;
|
| + native_ptr = (char*) 0x0000EF12;
|
| +
|
| + ASSERT_EQ(native_ptr, FromMinsfiPtr(untrusted_ptr, &sb));
|
| +}
|
| +
|
| +void test_from_ptr_adds_base(void) {
|
| + sb.mem_base = (char*) 0xABCD1000;
|
| + sb.ptr_mask = (sfiptr_t) 0xFFFFFFFF;
|
| +
|
| + untrusted_ptr = (sfiptr_t) 0x00123456;
|
| + native_ptr = (char*) 0xABDF4456;
|
| +
|
| + ASSERT_EQ(native_ptr, FromMinsfiPtr(untrusted_ptr, &sb));
|
| +}
|
| +
|
| +void test_to_ptr_subtracts_base(void) {
|
| + sb.mem_base = (char*) 0x11111000;
|
| + sb.ptr_mask = (sfiptr_t) 0xFFFFFFFF;
|
| +
|
| + native_ptr = (char*) 0x11234567;
|
| + untrusted_ptr = (sfiptr_t) 0x00123567;
|
| +
|
| + ASSERT_EQ(untrusted_ptr, ToMinsfiPtr(native_ptr, &sb));
|
| +}
|
| +
|
| +void test_to_ptr_checks_lower_bound(void) {
|
| + sb.mem_base = (char*) 0x11111000;
|
| + sb.ptr_mask = (sfiptr_t) 0xFFFFFFFF;
|
| +
|
| + /* last rejected pointer */
|
| + native_ptr = (char*) 0x11110FFF;
|
| + untrusted_ptr = (sfiptr_t) 0xCAFEBABE; /* mock error code */
|
| +
|
| + ASSERT_EQ(untrusted_ptr, ToMinsfiPtr(native_ptr, &sb));
|
| +
|
| + /* first accepted pointer */
|
| + native_ptr = (char*) 0x11111000;
|
| + untrusted_ptr = (sfiptr_t) 0x00000000;
|
| +
|
| + ASSERT_EQ(untrusted_ptr, ToMinsfiPtr(native_ptr, &sb));
|
| +}
|
| +
|
| +void test_to_ptr_checks_upper_bound(void) {
|
| + sb.mem_base = (char*) 0x11110000;
|
| + sb.ptr_mask = (sfiptr_t) 0x0000FFFF;
|
| +
|
| + /* last accepted pointer */
|
| + native_ptr = (char*) 0x1111FFFF;
|
| + untrusted_ptr = (sfiptr_t) 0x0000FFFF;
|
| +
|
| + ASSERT_EQ(untrusted_ptr, ToMinsfiPtr(native_ptr, &sb));
|
| +
|
| + /* first rejected pointer */
|
| + native_ptr = (char*) 0x11120000;
|
| + untrusted_ptr = (sfiptr_t) 0xCAFEBABE; /* mock error code */
|
| +
|
| + ASSERT_EQ(untrusted_ptr, ToMinsfiPtr(native_ptr, &sb));
|
| +}
|
| +
|
| +int main(void) {
|
| + test_from_ptr_masks_pointer();
|
| + test_from_ptr_adds_base();
|
| + test_to_ptr_subtracts_base();
|
| + test_to_ptr_checks_lower_bound();
|
| + test_to_ptr_checks_upper_bound();
|
| + return 0;
|
| +}
|
|
|