Chromium Code Reviews| Index: tests/minsfi/init_trusted.c |
| diff --git a/tests/minsfi/init_trusted.c b/tests/minsfi/init_trusted.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b8eb5bc683f490355ef92cd876da0742bbea1746 |
| --- /dev/null |
| +++ b/tests/minsfi/init_trusted.c |
| @@ -0,0 +1,128 @@ |
| +/* |
| + * 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. |
| + */ |
| + |
| +#include "native_client/src/include/minsfi.h" |
| +#include "native_client/src/include/minsfi_priv.h" |
| +#include "native_client/src/include/nacl_assert.h" |
| + |
| +manifest init_manifest(void) { |
| + manifest sb; |
| + layout mem; |
| + |
| + sb.ptr_size = 24; |
| + sb.dataseg_offset = 0x1000; |
| + sb.dataseg_size = 0x400; |
|
jvoung (off chromium)
2014/09/05 00:32:00
Is it important that dataseg_size < page_size? (to
dbrazdil
2014/09/05 19:41:38
It's more the fact that dataseg_size is not page s
|
| + |
| + ASSERT_EQ(true, generate_layout(&sb, 0x1000, &mem)); |
| + return sb; |
| +} |
| + |
| +void test_valid_layout(void) { |
| + unsigned page_size = 0x1000; |
| + manifest sb = init_manifest(); |
| + layout mem; |
| + |
| + ASSERT_EQ(true, generate_layout(&sb, page_size, &mem)); |
| + |
| + ASSERT_EQ( 0x1000, mem.dataseg.offset); |
| + ASSERT_EQ( 0x2000, mem.dataseg.offset + mem.dataseg.length); |
| + ASSERT_EQ( 0x3000, mem.heap.offset); |
| + ASSERT_EQ( 0xFDF000, mem.heap.offset + mem.heap.length); |
| + ASSERT_EQ( 0xFE0000, mem.stack.offset); |
| + ASSERT_EQ(0x1000000, mem.stack.offset + mem.stack.length); |
| +} |
| + |
| +void test_page_size_not_pow2(void) { |
| + manifest sb = init_manifest(); |
| + layout mem; |
| + |
| + ASSERT_EQ(false, generate_layout(&sb, 1234, &mem)); |
| +} |
| + |
| +void test_ptrsize_invalid(void) { |
| + unsigned page_size = 0x1000; |
| + manifest sb = init_manifest(); |
| + layout mem; |
| + |
| + sb.ptr_size = 0; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| + |
| + sb.ptr_size = 19; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| + |
| + sb.ptr_size = 33; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| +} |
| + |
| +void test_dataseg_pos_invalid(void) { |
| + unsigned page_size = 0x1000; |
| + manifest sb = init_manifest(); |
| + layout mem; |
| + |
| + /* offset not page-aligned */ |
| + sb.dataseg_offset = 0x1001; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| + |
| + /* offset out of bounds */ |
| + sb.dataseg_offset = (1 << 25); |
|
jvoung (off chromium)
2014/09/05 00:32:00
Maybe the "25" could have been based off sb.ptr_si
dbrazdil
2014/09/05 19:41:38
Done. All of these constants are quite fragile so
|
| + sb.dataseg_size = 0x400; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| + |
| + /* end of the region out of bounds */ |
| + sb.dataseg_offset = 0x1000; |
| + sb.dataseg_size = (1 << 24) - 0x1001; /* gets rounded up and fails */ |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| +} |
| + |
| +void test_no_space_for_heap(void) { |
| + unsigned page_size = 4096; |
| + manifest sb = init_manifest(); |
| + layout mem; |
| + bool ret; |
| + |
| + /* heap size exactly one page */ |
| + sb.dataseg_size = (1 << 24) - sb.dataseg_offset - 35 * page_size; |
| + ret = generate_layout(&sb, page_size, &mem); |
| + ASSERT_EQ(true, ret); |
| + ASSERT_EQ(page_size, mem.heap.length); |
| + |
| + /* heap size less than one page. */ |
| + sb.dataseg_size += 1; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| + |
| + /* heap size negative */ |
| + sb.dataseg_size += page_size; |
| + ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); |
| +} |
| + |
| +void test_invoke_sandbox(void) { |
| + int i; |
| + int ret_val = 0xCAFEBABE; |
| + |
| + /* multiple invocations without destroying */ |
| + for (i = 0; i < 3; i++) |
| + ASSERT_EQ(ret_val, minsfi_exec()); |
| + |
| + /* multiple invocations with destroying */ |
| + for (i = 0; i < 3; i++) { |
| + ASSERT_EQ(ret_val, minsfi_exec()); |
|
jvoung (off chromium)
2014/09/05 00:32:00
Do you expect that sandbox base to be random/re-in
dbrazdil
2014/09/05 19:41:38
Possibly in the future? The extension unpacking wo
|
| + ASSERT_EQ(true, minsfi_destroy()); |
| + } |
| + |
| + /* multiple destroys without initialization */ |
| + for (i = 0; i < 3; i++) |
| + ASSERT_EQ(true, minsfi_destroy()); |
| +} |
| + |
| +int main(void) { |
| + test_valid_layout(); |
| + test_page_size_not_pow2(); |
| + test_ptrsize_invalid(); |
| + test_dataseg_pos_invalid(); |
| + test_no_space_for_heap(); |
| + test_invoke_sandbox(); |
| + return 0; |
| +} |