OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2013 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 "native_client/src/trusted/desc_cacheability/desc_cacheability.h" | 7 #include "native_client/src/trusted/desc_cacheability/desc_cacheability.h" |
8 | 8 |
9 #include "native_client/src/include/portability.h" | 9 #include "native_client/src/include/portability.h" |
10 #include "native_client/src/public/desc_metadata_types.h" | 10 #include "native_client/src/public/desc_metadata_types.h" |
| 11 #include "native_client/src/public/nacl_file_info.h" |
11 #include "native_client/src/shared/platform/nacl_log.h" | 12 #include "native_client/src/shared/platform/nacl_log.h" |
12 #include "native_client/src/trusted/desc/nacl_desc_base.h" | 13 #include "native_client/src/trusted/desc/nacl_desc_base.h" |
| 14 #include "native_client/src/trusted/desc/nacl_desc_file_info.h" |
13 #include "native_client/src/trusted/desc/nacl_desc_io.h" | 15 #include "native_client/src/trusted/desc/nacl_desc_io.h" |
14 #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" | 16 #include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" |
15 #include "native_client/src/trusted/validator/nacl_file_info.h" | |
16 #include "native_client/src/trusted/validator/rich_file_info.h" | 17 #include "native_client/src/trusted/validator/rich_file_info.h" |
17 #include "native_client/src/trusted/validator/validation_cache.h" | 18 #include "native_client/src/trusted/validator/validation_cache.h" |
18 | 19 |
19 int NaClDescSetFileToken(struct NaClDesc *desc, | |
20 struct NaClFileToken const *token) { | |
21 int error; | |
22 error = (*NACL_VTBL(NaClDesc, desc)-> | |
23 SetMetadata)(desc, | |
24 NACL_DESC_METADATA_FILE_TOKEN_TYPE, | |
25 sizeof *token, (uint8_t const *) token); | |
26 if (0 != error) { | |
27 NaClLog(4, "NaClDescSetFileToken: failed, errno %d\n", -error); | |
28 return 0; | |
29 } | |
30 return 1; | |
31 } | |
32 | |
33 int NaClDescGetFileToken(struct NaClDesc *desc, | |
34 struct NaClFileToken *out_token) { | |
35 int32_t metadata_type; | |
36 uint32_t metadata_bytes; | |
37 | |
38 metadata_bytes = (uint32_t) sizeof *out_token; | |
39 metadata_type = (*NACL_VTBL(NaClDesc, desc)-> | |
40 GetMetadata)(desc, &metadata_bytes, | |
41 (uint8_t *) out_token); | |
42 if (NACL_DESC_METADATA_NONE_TYPE == metadata_type) { | |
43 NaClLog(4, "NaClDescGetFileToken: no meta data, cannot map\n"); | |
44 return 0; | |
45 } else if (NACL_DESC_METADATA_FILE_TOKEN_TYPE != metadata_type) { | |
46 return 0; | |
47 } else if (metadata_bytes != (uint32_t) sizeof *out_token) { | |
48 /* there is supposed to be a file token, but wrong size? */ | |
49 NaClLog(LOG_WARNING, | |
50 "NaClDescGetFileToken: purported file token present," | |
51 " but token size is incorrect.\n"); | |
52 return 0; | |
53 } | |
54 NaClLog(4, | |
55 "NaClDescGetFileToken: got token 0x%"NACL_PRIx64":%"NACL_PRIx64"\n", | |
56 out_token->hi, out_token->lo); | |
57 return 1; | |
58 } | |
59 | |
60 struct NaClDesc *NaClExchangeFileTokenForMappableDesc( | 20 struct NaClDesc *NaClExchangeFileTokenForMappableDesc( |
61 struct NaClFileToken *file_token, | 21 struct NaClFileToken *file_token, |
62 struct NaClValidationCache *validation_cache) { | 22 struct NaClValidationCache *validation_cache) { |
63 int32_t new_fd; | 23 int32_t new_fd; |
64 char *file_path; | 24 char *file_path; |
65 uint32_t file_path_length; | 25 uint32_t file_path_length; |
66 struct NaClDesc *desc = NULL; | 26 struct NaClDesc *desc = NULL; |
67 | 27 |
68 /* | 28 /* |
69 * Not all file loading paths will produce a valid token. Zero is | 29 * Not all file loading paths will produce a valid token. Zero is |
70 * an invalid token value that indicates there is nothing to | 30 * an invalid token value that indicates there is nothing to |
71 * resolve. In this case, assume nothing about the providence of | 31 * resolve. In this case, assume nothing about the providence of |
72 * the file. | 32 * the file. |
73 */ | 33 */ |
74 if (!(file_token->lo == 0 && file_token->hi == 0) && | 34 if (NaClFileTokenIsValid(file_token) && |
75 validation_cache->ResolveFileToken != NULL && | 35 validation_cache->ResolveFileToken != NULL && |
76 validation_cache->ResolveFileToken(validation_cache->handle, | 36 validation_cache->ResolveFileToken(validation_cache->handle, |
77 file_token, | 37 file_token, |
78 &new_fd, | 38 &new_fd, |
79 &file_path, | 39 &file_path, |
80 &file_path_length)) { | 40 &file_path_length)) { |
81 struct NaClRichFileInfo info; | 41 struct NaClRichFileInfo info; |
82 | 42 |
83 desc = NaClDescIoDescFromHandleAllocCtor((NaClHandle) new_fd, | 43 desc = NaClDescIoDescFromHandleAllocCtor((NaClHandle) new_fd, |
84 NACL_ABI_O_RDONLY); | 44 NACL_ABI_O_RDONLY); |
(...skipping 25 matching lines...) Expand all Loading... |
110 " file token\n"); | 70 " file token\n"); |
111 } else { | 71 } else { |
112 replacement = NaClExchangeFileTokenForMappableDesc(&file_token, | 72 replacement = NaClExchangeFileTokenForMappableDesc(&file_token, |
113 validation_cache); | 73 validation_cache); |
114 if (NULL != replacement) { | 74 if (NULL != replacement) { |
115 NaClDescUnref(desc); | 75 NaClDescUnref(desc); |
116 *desc_in_out = replacement; | 76 *desc_in_out = replacement; |
117 } | 77 } |
118 } | 78 } |
119 } | 79 } |
OLD | NEW |