OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <cstring> | 8 #include <cstring> |
9 | 9 |
10 #if NACL_WINDOWS | 10 #if NACL_WINDOWS |
11 # include <io.h> | 11 # include <io.h> |
12 #endif | 12 #endif |
13 | 13 |
14 #include "native_client/src/public/chrome_main.h" | 14 #include "native_client/src/public/chrome_main.h" |
15 #include "native_client/src/public/nacl_app.h" | 15 #include "native_client/src/public/nacl_app.h" |
| 16 #include "native_client/src/public/nacl_file_info.h" |
16 #include "native_client/src/shared/platform/nacl_check.h" | 17 #include "native_client/src/shared/platform/nacl_check.h" |
17 #include "native_client/src/shared/platform/nacl_threads.h" | 18 #include "native_client/src/shared/platform/nacl_threads.h" |
18 #include "native_client/src/shared/srpc/nacl_srpc.h" | 19 #include "native_client/src/shared/srpc/nacl_srpc.h" |
19 #include "native_client/src/trusted/desc/nacl_desc_custom.h" | 20 #include "native_client/src/trusted/desc/nacl_desc_custom.h" |
20 #include "native_client/src/trusted/desc_cacheability/desc_cacheability.h" | 21 #include "native_client/src/trusted/desc/nacl_desc_file_info.h" |
21 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" | 22 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" |
22 #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" | 23 #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" |
23 #include "native_client/src/trusted/service_runtime/nacl_all_modules.h" | 24 #include "native_client/src/trusted/service_runtime/nacl_all_modules.h" |
24 #include "native_client/src/trusted/service_runtime/nacl_config.h" | 25 #include "native_client/src/trusted/service_runtime/nacl_config.h" |
25 #include "native_client/src/trusted/service_runtime/nacl_valgrind_hooks.h" | 26 #include "native_client/src/trusted/service_runtime/nacl_valgrind_hooks.h" |
26 #include "native_client/src/trusted/service_runtime/sel_addrspace.h" | 27 #include "native_client/src/trusted/service_runtime/sel_addrspace.h" |
27 #include "native_client/src/trusted/service_runtime/sel_ldr.h" | 28 #include "native_client/src/trusted/service_runtime/sel_ldr.h" |
28 #include "native_client/src/trusted/validator/nacl_file_info.h" | |
29 #include "native_client/src/trusted/validator/validation_cache.h" | 29 #include "native_client/src/trusted/validator/validation_cache.h" |
30 | 30 |
31 | 31 |
32 int OpenFileReadOnly(const char *filename) { | 32 int OpenFileReadOnly(const char *filename) { |
33 #if NACL_WINDOWS | 33 #if NACL_WINDOWS |
34 return _open(filename, _O_RDONLY); | 34 return _open(filename, _O_RDONLY); |
35 #else | 35 #else |
36 return open(filename, O_RDONLY); | 36 return open(filename, O_RDONLY); |
37 #endif | 37 #endif |
38 } | 38 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 CHECK(h->expected_token_lo == file_token->lo); | 117 CHECK(h->expected_token_lo == file_token->lo); |
118 CHECK(h->expected_token_hi == file_token->hi); | 118 CHECK(h->expected_token_hi == file_token->hi); |
119 *fd = h->expected_file_handle; | 119 *fd = h->expected_file_handle; |
120 *file_path = h->expected_file_path; | 120 *file_path = h->expected_file_path; |
121 *file_path_length = static_cast<uint32_t>(strlen(h->expected_file_path)); | 121 *file_path_length = static_cast<uint32_t>(strlen(h->expected_file_path)); |
122 return 1; | 122 return 1; |
123 } | 123 } |
124 | 124 |
125 struct ThreadArgs { | 125 struct ThreadArgs { |
126 NaClHandle channel; | 126 NaClHandle channel; |
127 int nexe_fd; | 127 NaClFileInfo file_info; |
128 NaClFileToken nexe_token; | |
129 }; | 128 }; |
130 | 129 |
131 void WINAPI DummyRendererThread(void *thread_arg) { | 130 void WINAPI DummyRendererThread(void *thread_arg) { |
132 struct ThreadArgs *args = (struct ThreadArgs *) thread_arg; | 131 struct ThreadArgs *args = (struct ThreadArgs *) thread_arg; |
133 | 132 |
134 nacl::DescWrapperFactory desc_wrapper_factory; | 133 nacl::DescWrapperFactory desc_wrapper_factory; |
135 nacl::DescWrapper *nexe_desc = | 134 struct NaClDesc *desc = NaClDescIoFromFileInfo(args->file_info, |
136 desc_wrapper_factory.MakeFileDesc(args->nexe_fd, NACL_ABI_O_RDONLY); | 135 NACL_ABI_O_RDONLY); |
| 136 CHECK(desc != NULL); |
| 137 nacl::DescWrapper *nexe_desc = desc_wrapper_factory.MakeGenericCleanup(desc); |
137 CHECK(nexe_desc != NULL); | 138 CHECK(nexe_desc != NULL); |
138 if (args->nexe_token.lo != 0 && args->nexe_token.hi != 0) { | |
139 int token_res = NaClDescSetFileToken(nexe_desc->desc(), &args->nexe_token); | |
140 CHECK(token_res != 0); | |
141 } | |
142 | |
143 DummyLauncher launcher(args->channel); | 139 DummyLauncher launcher(args->channel); |
144 NaClSrpcChannel trusted_channel; | 140 NaClSrpcChannel trusted_channel; |
145 NaClSrpcChannel untrusted_channel; | 141 NaClSrpcChannel untrusted_channel; |
146 CHECK(launcher.SetupCommandAndLoad(&trusted_channel, nexe_desc)); | 142 CHECK(launcher.SetupCommandAndLoad(&trusted_channel, nexe_desc)); |
147 CHECK(launcher.StartModuleAndSetupAppChannel(&trusted_channel, | 143 CHECK(launcher.StartModuleAndSetupAppChannel(&trusted_channel, |
148 &untrusted_channel)); | 144 &untrusted_channel)); |
149 } | 145 } |
150 | 146 |
151 void ExampleDescDestroy(void *handle) { | 147 void ExampleDescDestroy(void *handle) { |
152 UNREFERENCED_PARAMETER(handle); | 148 UNREFERENCED_PARAMETER(handle); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 NaClHandleBootstrapArgs(&argc, &argv); | 189 NaClHandleBootstrapArgs(&argc, &argv); |
194 #if NACL_LINUX | 190 #if NACL_LINUX |
195 args->prereserved_sandbox_size = g_prereserved_sandbox_size; | 191 args->prereserved_sandbox_size = g_prereserved_sandbox_size; |
196 #endif | 192 #endif |
197 | 193 |
198 CHECK(argc == 3 || argc == 4); | 194 CHECK(argc == 3 || argc == 4); |
199 | 195 |
200 args->irt_fd = OpenFileReadOnly(argv[1]); | 196 args->irt_fd = OpenFileReadOnly(argv[1]); |
201 CHECK(args->irt_fd >= 0); | 197 CHECK(args->irt_fd >= 0); |
202 | 198 |
203 thread_args.nexe_fd = OpenFileReadOnly(argv[2]); | 199 memset(&thread_args.file_info, 0, sizeof thread_args.file_info); |
204 CHECK(thread_args.nexe_fd >= 0); | 200 thread_args.file_info.desc = OpenFileReadOnly(argv[2]); |
| 201 CHECK(thread_args.file_info.desc >= 0); |
205 NaClFileNameForValgrind(argv[2]); | 202 NaClFileNameForValgrind(argv[2]); |
206 | 203 |
207 NaClHandle socketpair[2]; | 204 NaClHandle socketpair[2]; |
208 CHECK(NaClSocketPair(socketpair) == 0); | 205 CHECK(NaClSocketPair(socketpair) == 0); |
209 args->imc_bootstrap_handle = socketpair[0]; | 206 args->imc_bootstrap_handle = socketpair[0]; |
210 thread_args.channel = socketpair[1]; | 207 thread_args.channel = socketpair[1]; |
211 | 208 |
212 // Check that NaClDescMakeCustomDesc() works when called in this context. | 209 // Check that NaClDescMakeCustomDesc() works when called in this context. |
213 NaClAppSetDesc(nap, NACL_CHROME_DESC_BASE, MakeExampleDesc()); | 210 NaClAppSetDesc(nap, NACL_CHROME_DESC_BASE, MakeExampleDesc()); |
214 | 211 |
215 // Set up mock validation cache. | 212 // Set up mock validation cache. |
216 struct TestValidationHandle test_handle; | 213 struct TestValidationHandle test_handle; |
217 struct NaClValidationCache test_cache; | 214 struct NaClValidationCache test_cache; |
218 if (argc == 4) { | 215 if (argc == 4) { |
219 CHECK(strcmp(argv[3], "-vcache") == 0); | 216 CHECK(strcmp(argv[3], "-vcache") == 0); |
220 test_handle.expected_token_lo = 0xabcdef123456789LL; | 217 test_handle.expected_token_lo = 0xabcdef123456789LL; |
221 test_handle.expected_token_hi = 0x101010101010101LL; | 218 test_handle.expected_token_hi = 0x101010101010101LL; |
222 test_handle.expected_file_handle = OpenFileHandleReadExec(argv[2]); | 219 test_handle.expected_file_handle = OpenFileHandleReadExec(argv[2]); |
223 test_handle.expected_file_path = strdup(argv[2]); | 220 test_handle.expected_file_path = strdup(argv[2]); |
224 test_cache.handle = &test_handle; | 221 test_cache.handle = &test_handle; |
225 test_cache.CreateQuery = &TestCreateQuery; | 222 test_cache.CreateQuery = &TestCreateQuery; |
226 test_cache.AddData = &TestAddData; | 223 test_cache.AddData = &TestAddData; |
227 test_cache.QueryKnownToValidate = &TestQueryKnownToValidate; | 224 test_cache.QueryKnownToValidate = &TestQueryKnownToValidate; |
228 test_cache.SetKnownToValidate = &TestSetKnownToValidate; | 225 test_cache.SetKnownToValidate = &TestSetKnownToValidate; |
229 test_cache.DestroyQuery = &TestDestroyQuery; | 226 test_cache.DestroyQuery = &TestDestroyQuery; |
230 test_cache.CachingIsInexpensive = &TestCachingIsInexpensive; | 227 test_cache.CachingIsInexpensive = &TestCachingIsInexpensive; |
231 test_cache.ResolveFileToken = &TestResolveFileToken; | 228 test_cache.ResolveFileToken = &TestResolveFileToken; |
232 args->validation_cache = &test_cache; | 229 args->validation_cache = &test_cache; |
233 thread_args.nexe_token.lo = test_handle.expected_token_lo; | 230 thread_args.file_info.file_token.lo = test_handle.expected_token_lo; |
234 thread_args.nexe_token.hi = test_handle.expected_token_hi; | 231 thread_args.file_info.file_token.hi = test_handle.expected_token_hi; |
235 } else { | |
236 thread_args.nexe_token.lo = 0; | |
237 thread_args.nexe_token.hi = 0; | |
238 } | 232 } |
239 | 233 |
240 NaClThread thread; | 234 NaClThread thread; |
241 CHECK(NaClThreadCtor(&thread, DummyRendererThread, &thread_args, | 235 CHECK(NaClThreadCtor(&thread, DummyRendererThread, &thread_args, |
242 NACL_KERN_STACK_SIZE)); | 236 NACL_KERN_STACK_SIZE)); |
243 | 237 |
244 NaClChromeMainStartApp(nap, args); | 238 NaClChromeMainStartApp(nap, args); |
245 NaClLog(LOG_FATAL, "NaClChromeMainStartApp() should never return\n"); | 239 NaClLog(LOG_FATAL, "NaClChromeMainStartApp() should never return\n"); |
246 return 1; | 240 return 1; |
247 } | 241 } |
OLD | NEW |