OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2014 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can be | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 #include "native_client/src/include/minsfi.h" | |
8 #include "native_client/src/include/minsfi_priv.h" | |
9 #include "native_client/src/include/nacl_assert.h" | |
10 | |
11 manifest init_manifest(void) { | |
12 manifest sb; | |
13 layout mem; | |
14 | |
15 sb.ptr_size = 24; | |
16 sb.dataseg_offset = 0x1000; | |
17 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
| |
18 | |
19 ASSERT_EQ(true, generate_layout(&sb, 0x1000, &mem)); | |
20 return sb; | |
21 } | |
22 | |
23 void test_valid_layout(void) { | |
24 unsigned page_size = 0x1000; | |
25 manifest sb = init_manifest(); | |
26 layout mem; | |
27 | |
28 ASSERT_EQ(true, generate_layout(&sb, page_size, &mem)); | |
29 | |
30 ASSERT_EQ( 0x1000, mem.dataseg.offset); | |
31 ASSERT_EQ( 0x2000, mem.dataseg.offset + mem.dataseg.length); | |
32 ASSERT_EQ( 0x3000, mem.heap.offset); | |
33 ASSERT_EQ( 0xFDF000, mem.heap.offset + mem.heap.length); | |
34 ASSERT_EQ( 0xFE0000, mem.stack.offset); | |
35 ASSERT_EQ(0x1000000, mem.stack.offset + mem.stack.length); | |
36 } | |
37 | |
38 void test_page_size_not_pow2(void) { | |
39 manifest sb = init_manifest(); | |
40 layout mem; | |
41 | |
42 ASSERT_EQ(false, generate_layout(&sb, 1234, &mem)); | |
43 } | |
44 | |
45 void test_ptrsize_invalid(void) { | |
46 unsigned page_size = 0x1000; | |
47 manifest sb = init_manifest(); | |
48 layout mem; | |
49 | |
50 sb.ptr_size = 0; | |
51 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
52 | |
53 sb.ptr_size = 19; | |
54 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
55 | |
56 sb.ptr_size = 33; | |
57 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
58 } | |
59 | |
60 void test_dataseg_pos_invalid(void) { | |
61 unsigned page_size = 0x1000; | |
62 manifest sb = init_manifest(); | |
63 layout mem; | |
64 | |
65 /* offset not page-aligned */ | |
66 sb.dataseg_offset = 0x1001; | |
67 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
68 | |
69 /* offset out of bounds */ | |
70 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
| |
71 sb.dataseg_size = 0x400; | |
72 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
73 | |
74 /* end of the region out of bounds */ | |
75 sb.dataseg_offset = 0x1000; | |
76 sb.dataseg_size = (1 << 24) - 0x1001; /* gets rounded up and fails */ | |
77 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
78 } | |
79 | |
80 void test_no_space_for_heap(void) { | |
81 unsigned page_size = 4096; | |
82 manifest sb = init_manifest(); | |
83 layout mem; | |
84 bool ret; | |
85 | |
86 /* heap size exactly one page */ | |
87 sb.dataseg_size = (1 << 24) - sb.dataseg_offset - 35 * page_size; | |
88 ret = generate_layout(&sb, page_size, &mem); | |
89 ASSERT_EQ(true, ret); | |
90 ASSERT_EQ(page_size, mem.heap.length); | |
91 | |
92 /* heap size less than one page. */ | |
93 sb.dataseg_size += 1; | |
94 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
95 | |
96 /* heap size negative */ | |
97 sb.dataseg_size += page_size; | |
98 ASSERT_EQ(false, generate_layout(&sb, page_size, &mem)); | |
99 } | |
100 | |
101 void test_invoke_sandbox(void) { | |
102 int i; | |
103 int ret_val = 0xCAFEBABE; | |
104 | |
105 /* multiple invocations without destroying */ | |
106 for (i = 0; i < 3; i++) | |
107 ASSERT_EQ(ret_val, minsfi_exec()); | |
108 | |
109 /* multiple invocations with destroying */ | |
110 for (i = 0; i < 3; i++) { | |
111 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
| |
112 ASSERT_EQ(true, minsfi_destroy()); | |
113 } | |
114 | |
115 /* multiple destroys without initialization */ | |
116 for (i = 0; i < 3; i++) | |
117 ASSERT_EQ(true, minsfi_destroy()); | |
118 } | |
119 | |
120 int main(void) { | |
121 test_valid_layout(); | |
122 test_page_size_not_pow2(); | |
123 test_ptrsize_invalid(); | |
124 test_dataseg_pos_invalid(); | |
125 test_no_space_for_heap(); | |
126 test_invoke_sandbox(); | |
127 return 0; | |
128 } | |
OLD | NEW |