OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifdef _MSC_VER | 5 #ifdef _MSC_VER |
6 // Do not warn about use of std::copy with raw pointers. | 6 // Do not warn about use of std::copy with raw pointers. |
7 #pragma warning(disable : 4996) | 7 #pragma warning(disable : 4996) |
8 #endif | 8 #endif |
9 | 9 |
10 #include "native_client/src/trusted/plugin/plugin.h" | 10 #include "native_client/src/trusted/plugin/plugin.h" |
11 | 11 |
12 #include <fcntl.h> | 12 #include <fcntl.h> |
jvoung (off chromium)
2013/05/23 20:33:19
does fcntl.h still need to be included?
There's s
eliben
2013/05/23 20:54:25
Removed
| |
13 #include <stdio.h> | |
14 #include <stdlib.h> | |
15 #include <string.h> | |
16 | |
17 #include <sys/stat.h> | 13 #include <sys/stat.h> |
18 #include <sys/types.h> | 14 #include <sys/types.h> |
19 | 15 |
20 #include <algorithm> | 16 #include <algorithm> |
21 #include <deque> | 17 #include <deque> |
22 #include <string> | 18 #include <string> |
23 #include <vector> | 19 #include <vector> |
24 | 20 |
25 #include "native_client/src/include/nacl_base.h" | 21 #include "native_client/src/include/nacl_base.h" |
26 #include "native_client/src/include/nacl_macros.h" | 22 #include "native_client/src/include/nacl_macros.h" |
27 #include "native_client/src/include/nacl_scoped_ptr.h" | 23 #include "native_client/src/include/nacl_scoped_ptr.h" |
28 #include "native_client/src/include/nacl_string.h" | 24 #include "native_client/src/include/nacl_string.h" |
29 #include "native_client/src/include/portability.h" | 25 #include "native_client/src/include/portability.h" |
30 #include "native_client/src/include/portability_io.h" | 26 #include "native_client/src/include/portability_io.h" |
31 #include "native_client/src/include/portability_string.h" | 27 #include "native_client/src/include/portability_string.h" |
32 #include "native_client/src/shared/platform/nacl_check.h" | 28 #include "native_client/src/shared/platform/nacl_check.h" |
33 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" | 29 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
34 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" | 30 #include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h" |
31 #include "native_client/src/trusted/plugin/file_utils.h" | |
35 #include "native_client/src/trusted/plugin/json_manifest.h" | 32 #include "native_client/src/trusted/plugin/json_manifest.h" |
36 #include "native_client/src/trusted/plugin/nacl_entry_points.h" | 33 #include "native_client/src/trusted/plugin/nacl_entry_points.h" |
37 #include "native_client/src/trusted/plugin/nacl_subprocess.h" | 34 #include "native_client/src/trusted/plugin/nacl_subprocess.h" |
38 #include "native_client/src/trusted/plugin/nexe_arch.h" | 35 #include "native_client/src/trusted/plugin/nexe_arch.h" |
39 #include "native_client/src/trusted/plugin/plugin_error.h" | 36 #include "native_client/src/trusted/plugin/plugin_error.h" |
40 #include "native_client/src/trusted/plugin/scriptable_plugin.h" | 37 #include "native_client/src/trusted/plugin/scriptable_plugin.h" |
41 #include "native_client/src/trusted/plugin/service_runtime.h" | 38 #include "native_client/src/trusted/plugin/service_runtime.h" |
42 #include "native_client/src/trusted/plugin/utility.h" | 39 #include "native_client/src/trusted/plugin/utility.h" |
43 #include "native_client/src/trusted/service_runtime/nacl_error_code.h" | 40 #include "native_client/src/trusted/service_runtime/nacl_error_code.h" |
44 | 41 |
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1097 error_info.SetReport(ERROR_MANIFEST_NOACCESS_URL, | 1094 error_info.SetReport(ERROR_MANIFEST_NOACCESS_URL, |
1098 "access to manifest url was denied."); | 1095 "access to manifest url was denied."); |
1099 ReportLoadError(error_info); | 1096 ReportLoadError(error_info); |
1100 } else { | 1097 } else { |
1101 error_info.SetReport(ERROR_MANIFEST_LOAD_URL, | 1098 error_info.SetReport(ERROR_MANIFEST_LOAD_URL, |
1102 "could not load manifest url."); | 1099 "could not load manifest url."); |
1103 ReportLoadError(error_info); | 1100 ReportLoadError(error_info); |
1104 } | 1101 } |
1105 return; | 1102 return; |
1106 } | 1103 } |
1107 // Duplicate the file descriptor in order to create a FILE stream with it | 1104 // SlurpFile closes the file descriptor after reading (or on error). |
1108 // that can later be closed without closing the original descriptor. The | 1105 // Duplicate our file descriptor since it will be handled by the browser. |
1109 // browser will take care of the original descriptor. | |
1110 int dup_file_desc = DUP(file_desc); | 1106 int dup_file_desc = DUP(file_desc); |
1111 struct stat stat_buf; | 1107 nacl::string json_buffer; |
1112 if (0 != fstat(dup_file_desc, &stat_buf)) { | 1108 file_utils::StatusCode status = file_utils::SlurpFile( |
1113 CLOSE(dup_file_desc); | 1109 dup_file_desc, json_buffer, kNaClManifestMaxFileBytes); |
1114 error_info.SetReport(ERROR_MANIFEST_STAT, | 1110 |
1115 "could not stat manifest file."); | 1111 if (status != file_utils::SUCCESS) { |
1112 switch (status) { | |
1113 case file_utils::SUCCESS: | |
1114 CHECK(0); | |
1115 break; | |
1116 case file_utils::ERROR_MEM_ALLOC: | |
1117 error_info.SetReport(ERROR_MANIFEST_MEMORY_ALLOC, | |
1118 "could not allocate manifest memory."); | |
1119 break; | |
1120 case file_utils::ERROR_OPEN: | |
1121 error_info.SetReport(ERROR_MANIFEST_OPEN, | |
1122 "could not open manifest file."); | |
1123 break; | |
1124 case file_utils::ERROR_FILE_TOO_LARGE: | |
1125 error_info.SetReport(ERROR_MANIFEST_TOO_LARGE, | |
1126 "manifest file too large."); | |
1127 break; | |
1128 case file_utils::ERROR_STAT: | |
1129 error_info.SetReport(ERROR_MANIFEST_STAT, | |
1130 "could not stat manifest file."); | |
1131 break; | |
1132 case file_utils::ERROR_READ: | |
1133 error_info.SetReport(ERROR_MANIFEST_READ, | |
1134 "could not read manifest file."); | |
1135 break; | |
1136 } | |
1116 ReportLoadError(error_info); | 1137 ReportLoadError(error_info); |
1117 return; | 1138 return; |
1118 } | 1139 } |
1119 size_t bytes_to_read = static_cast<size_t>(stat_buf.st_size); | |
1120 if (bytes_to_read > kNaClManifestMaxFileBytes) { | |
1121 CLOSE(dup_file_desc); | |
1122 error_info.SetReport(ERROR_MANIFEST_TOO_LARGE, | |
1123 "manifest file too large."); | |
1124 ReportLoadError(error_info); | |
1125 return; | |
1126 } | |
1127 FILE* json_file = fdopen(dup_file_desc, "rb"); | |
1128 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen " | |
1129 "(dup_file_desc=%"NACL_PRId32", json_file=%p)\n", | |
1130 dup_file_desc, static_cast<void*>(json_file))); | |
1131 if (json_file == NULL) { | |
1132 CLOSE(dup_file_desc); | |
1133 error_info.SetReport(ERROR_MANIFEST_OPEN, | |
1134 "could not open manifest file."); | |
1135 ReportLoadError(error_info); | |
1136 return; | |
1137 } | |
1138 nacl::scoped_array<char> json_buffer(new char[bytes_to_read + 1]); | |
1139 if (json_buffer == NULL) { | |
1140 fclose(json_file); | |
1141 error_info.SetReport(ERROR_MANIFEST_MEMORY_ALLOC, | |
1142 "could not allocate manifest memory."); | |
1143 ReportLoadError(error_info); | |
1144 return; | |
1145 } | |
1146 // json_buffer could hold a large enough buffer that the system might need | |
1147 // multiple reads to fill it, so iterate through reads. | |
1148 size_t total_bytes_read = 0; | |
1149 while (0 < bytes_to_read) { | |
1150 size_t bytes_this_read = fread(&json_buffer[total_bytes_read], | |
1151 sizeof(char), | |
1152 bytes_to_read, | |
1153 json_file); | |
1154 if (bytes_this_read < bytes_to_read && | |
1155 (feof(json_file) || ferror(json_file))) { | |
1156 PLUGIN_PRINTF(("Plugin::NaClManifestFileDidOpen failed: " | |
1157 "total_bytes_read=%"NACL_PRIuS" " | |
1158 "bytes_to_read=%"NACL_PRIuS"\n", | |
1159 total_bytes_read, bytes_to_read)); | |
1160 fclose(json_file); | |
1161 error_info.SetReport(ERROR_MANIFEST_READ, | |
1162 "could not read manifest file."); | |
1163 ReportLoadError(error_info); | |
1164 return; | |
1165 } | |
1166 total_bytes_read += bytes_this_read; | |
1167 bytes_to_read -= bytes_this_read; | |
1168 } | |
1169 // Once the bytes are read, the FILE is no longer needed, so close it. This | |
1170 // allows for early returns without leaking the |json_file| FILE object. | |
1171 fclose(json_file); | |
1172 // No need to close |file_desc|, that is handled by |nexe_downloader_|. | |
1173 json_buffer[total_bytes_read] = '\0'; // Force null termination. | |
1174 | 1140 |
1175 ProcessNaClManifest(json_buffer.get()); | 1141 ProcessNaClManifest(json_buffer); |
1176 } | 1142 } |
1177 | 1143 |
1178 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { | 1144 void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) { |
1179 HistogramSizeKB("NaCl.Perf.Size.Manifest", | 1145 HistogramSizeKB("NaCl.Perf.Size.Manifest", |
1180 static_cast<int32_t>(manifest_json.length() / 1024)); | 1146 static_cast<int32_t>(manifest_json.length() / 1024)); |
1181 nacl::string program_url; | 1147 nacl::string program_url; |
1182 PnaclOptions pnacl_options; | 1148 PnaclOptions pnacl_options; |
1183 ErrorInfo error_info; | 1149 ErrorInfo error_info; |
1184 if (!SetManifestObject(manifest_json, &error_info)) { | 1150 if (!SetManifestObject(manifest_json, &error_info)) { |
1185 ReportLoadError(error_info); | 1151 ReportLoadError(error_info); |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1675 static_cast<uint32_t>(text.size())); | 1641 static_cast<uint32_t>(text.size())); |
1676 const PPB_Console* console_interface = | 1642 const PPB_Console* console_interface = |
1677 static_cast<const PPB_Console*>( | 1643 static_cast<const PPB_Console*>( |
1678 module->GetBrowserInterface(PPB_CONSOLE_INTERFACE)); | 1644 module->GetBrowserInterface(PPB_CONSOLE_INTERFACE)); |
1679 console_interface->LogWithSource(pp_instance(), PP_LOGLEVEL_LOG, prefix, str); | 1645 console_interface->LogWithSource(pp_instance(), PP_LOGLEVEL_LOG, prefix, str); |
1680 var_interface->Release(prefix); | 1646 var_interface->Release(prefix); |
1681 var_interface->Release(str); | 1647 var_interface->Release(str); |
1682 } | 1648 } |
1683 | 1649 |
1684 } // namespace plugin | 1650 } // namespace plugin |
OLD | NEW |