Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: ppapi/native_client/src/trusted/plugin/plugin.cc

Issue 512323002: NaCl: Detect plugin crashes via EOF on Chromium IPC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "ppapi/native_client/src/trusted/plugin/plugin.h" 5 #include "ppapi/native_client/src/trusted/plugin/plugin.h"
6 6
7 #include <sys/stat.h> 7 #include <sys/stat.h>
8 #include <sys/types.h> 8 #include <sys/types.h>
9 9
10 #include <string> 10 #include <string>
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 } 65 }
66 66
67 bool Plugin::LoadHelperNaClModuleInternal(NaClSubprocess* subprocess, 67 bool Plugin::LoadHelperNaClModuleInternal(NaClSubprocess* subprocess,
68 const SelLdrStartParams& params) { 68 const SelLdrStartParams& params) {
69 CHECK(!pp::Module::Get()->core()->IsMainThread()); 69 CHECK(!pp::Module::Get()->core()->IsMainThread());
70 ServiceRuntime* service_runtime = 70 ServiceRuntime* service_runtime =
71 new ServiceRuntime(this, 71 new ServiceRuntime(this,
72 pp_instance(), 72 pp_instance(),
73 false, // No main_service_runtime. 73 false, // No main_service_runtime.
74 false, // No non-SFI mode (i.e. in SFI-mode). 74 false, // No non-SFI mode (i.e. in SFI-mode).
75 pp::BlockUntilComplete(),
76 pp::BlockUntilComplete()); 75 pp::BlockUntilComplete());
77 subprocess->set_service_runtime(service_runtime); 76 subprocess->set_service_runtime(service_runtime);
78 77
79 // Now start the SelLdr instance. This must be created on the main thread. 78 // Now start the SelLdr instance. This must be created on the main thread.
80 bool service_runtime_started = false; 79 bool service_runtime_started = false;
81 pp::CompletionCallback sel_ldr_callback = 80 pp::CompletionCallback sel_ldr_callback =
82 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone, 81 callback_factory_.NewCallback(&Plugin::SignalStartSelLdrDone,
83 &service_runtime_started, 82 &service_runtime_started,
84 service_runtime); 83 service_runtime);
85 pp::CompletionCallback callback = 84 pp::CompletionCallback callback =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 ServiceRuntime* service_runtime) { 120 ServiceRuntime* service_runtime) {
122 *started = (pp_error == PP_OK); 121 *started = (pp_error == PP_OK);
123 service_runtime->SignalStartSelLdrDone(); 122 service_runtime->SignalStartSelLdrDone();
124 } 123 }
125 124
126 void Plugin::LoadNaClModule(PP_NaClFileInfo file_info, 125 void Plugin::LoadNaClModule(PP_NaClFileInfo file_info,
127 bool uses_nonsfi_mode, 126 bool uses_nonsfi_mode,
128 bool enable_dyncode_syscalls, 127 bool enable_dyncode_syscalls,
129 bool enable_exception_handling, 128 bool enable_exception_handling,
130 bool enable_crash_throttling, 129 bool enable_crash_throttling,
131 const pp::CompletionCallback& init_done_cb, 130 const pp::CompletionCallback& init_done_cb) {
132 const pp::CompletionCallback& crash_cb) {
133 CHECK(pp::Module::Get()->core()->IsMainThread()); 131 CHECK(pp::Module::Get()->core()->IsMainThread());
134 // Before forking a new sel_ldr process, ensure that we do not leak 132 // Before forking a new sel_ldr process, ensure that we do not leak
135 // the ServiceRuntime object for an existing subprocess, and that any 133 // the ServiceRuntime object for an existing subprocess, and that any
136 // associated listener threads do not go unjoined because if they 134 // associated listener threads do not go unjoined because if they
137 // outlive the Plugin object, they will not be memory safe. 135 // outlive the Plugin object, they will not be memory safe.
138 ShutDownSubprocesses(); 136 ShutDownSubprocesses();
139 pp::Var manifest_base_url = 137 pp::Var manifest_base_url =
140 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance())); 138 pp::Var(pp::PASS_REF, nacl_interface_->GetManifestBaseURL(pp_instance()));
141 std::string manifest_base_url_str = manifest_base_url.AsString(); 139 std::string manifest_base_url_str = manifest_base_url.AsString();
142 140
143 SelLdrStartParams params(manifest_base_url_str, 141 SelLdrStartParams params(manifest_base_url_str,
144 file_info, 142 file_info,
145 true /* uses_irt */, 143 true /* uses_irt */,
146 true /* uses_ppapi */, 144 true /* uses_ppapi */,
147 enable_dyncode_syscalls, 145 enable_dyncode_syscalls,
148 enable_exception_handling, 146 enable_exception_handling,
149 enable_crash_throttling); 147 enable_crash_throttling);
150 ErrorInfo error_info; 148 ErrorInfo error_info;
151 ServiceRuntime* service_runtime = new ServiceRuntime( 149 ServiceRuntime* service_runtime = new ServiceRuntime(
152 this, pp_instance(), true, uses_nonsfi_mode, init_done_cb, crash_cb); 150 this, pp_instance(), true, uses_nonsfi_mode, init_done_cb);
153 main_subprocess_.set_service_runtime(service_runtime); 151 main_subprocess_.set_service_runtime(service_runtime);
154 if (NULL == service_runtime) { 152 if (NULL == service_runtime) {
155 error_info.SetReport( 153 error_info.SetReport(
156 PP_NACL_ERROR_SEL_LDR_INIT, 154 PP_NACL_ERROR_SEL_LDR_INIT,
157 "sel_ldr init failure " + main_subprocess_.description()); 155 "sel_ldr init failure " + main_subprocess_.description());
158 ReportLoadError(error_info); 156 ReportLoadError(error_info);
159 return; 157 return;
160 } 158 }
161 159
162 // We don't take any action once nexe loading has completed, so pass an empty 160 // We don't take any action once nexe loading has completed, so pass an empty
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 327
330 void Plugin::NexeFileDidOpen(int32_t pp_error) { 328 void Plugin::NexeFileDidOpen(int32_t pp_error) {
331 if (pp_error != PP_OK) 329 if (pp_error != PP_OK)
332 return; 330 return;
333 LoadNaClModule( 331 LoadNaClModule(
334 nexe_file_info_, 332 nexe_file_info_,
335 uses_nonsfi_mode_, 333 uses_nonsfi_mode_,
336 true, /* enable_dyncode_syscalls */ 334 true, /* enable_dyncode_syscalls */
337 true, /* enable_exception_handling */ 335 true, /* enable_exception_handling */
338 false, /* enable_crash_throttling */ 336 false, /* enable_crash_throttling */
339 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation), 337 callback_factory_.NewCallback(&Plugin::NexeFileDidOpenContinuation));
340 callback_factory_.NewCallback(&Plugin::NexeDidCrash));
341 } 338 }
342 339
343 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) { 340 void Plugin::NexeFileDidOpenContinuation(int32_t pp_error) {
344 UNREFERENCED_PARAMETER(pp_error); 341 UNREFERENCED_PARAMETER(pp_error);
345 NaClLog(4, "Entered NexeFileDidOpenContinuation\n"); 342 NaClLog(4, "Entered NexeFileDidOpenContinuation\n");
346 if (LoadNaClModuleContinuationIntern()) { 343 if (LoadNaClModuleContinuationIntern()) {
347 NaClLog(4, "NexeFileDidOpenContinuation: success;" 344 NaClLog(4, "NexeFileDidOpenContinuation: success;"
348 " setting histograms\n"); 345 " setting histograms\n");
349 int64_t nexe_size = nacl_interface_->GetNexeSize(pp_instance()); 346 int64_t nexe_size = nacl_interface_->GetNexeSize(pp_instance());
350 nacl_interface_->ReportLoadSuccess( 347 nacl_interface_->ReportLoadSuccess(
351 pp_instance(), nexe_size, nexe_size); 348 pp_instance(), nexe_size, nexe_size);
352 } else { 349 } else {
353 NaClLog(4, "NexeFileDidOpenContinuation: failed."); 350 NaClLog(4, "NexeFileDidOpenContinuation: failed.");
354 } 351 }
355 NaClLog(4, "Leaving NexeFileDidOpenContinuation\n"); 352 NaClLog(4, "Leaving NexeFileDidOpenContinuation\n");
356 } 353 }
357 354
358 void Plugin::NexeDidCrash(int32_t pp_error) {
359 PLUGIN_PRINTF(("Plugin::NexeDidCrash (pp_error=%" NACL_PRId32 ")\n",
360 pp_error));
361 nacl_interface_->NexeDidCrash(pp_instance());
362 }
363
364 void Plugin::BitcodeDidTranslate(int32_t pp_error) { 355 void Plugin::BitcodeDidTranslate(int32_t pp_error) {
365 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate (pp_error=%" NACL_PRId32 ")\n", 356 PLUGIN_PRINTF(("Plugin::BitcodeDidTranslate (pp_error=%" NACL_PRId32 ")\n",
366 pp_error)); 357 pp_error));
367 if (pp_error != PP_OK) { 358 if (pp_error != PP_OK) {
368 // Error should have been reported by pnacl. Just return. 359 // Error should have been reported by pnacl. Just return.
369 return; 360 return;
370 } 361 }
371 362
372 // Inform JavaScript that we successfully translated the bitcode to a nexe. 363 // Inform JavaScript that we successfully translated the bitcode to a nexe.
373 PP_FileHandle handle = pnacl_coordinator_->TakeTranslatedFileHandle(); 364 PP_FileHandle handle = pnacl_coordinator_->TakeTranslatedFileHandle();
374 365
375 PP_NaClFileInfo info; 366 PP_NaClFileInfo info;
376 info.handle = handle; 367 info.handle = handle;
377 info.token_lo = 0; 368 info.token_lo = 0;
378 info.token_hi = 0; 369 info.token_hi = 0;
379 LoadNaClModule( 370 LoadNaClModule(
380 info, 371 info,
381 false, /* uses_nonsfi_mode */ 372 false, /* uses_nonsfi_mode */
382 false, /* enable_dyncode_syscalls */ 373 false, /* enable_dyncode_syscalls */
383 false, /* enable_exception_handling */ 374 false, /* enable_exception_handling */
384 true, /* enable_crash_throttling */ 375 true, /* enable_crash_throttling */
385 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation), 376 callback_factory_.NewCallback(&Plugin::BitcodeDidTranslateContinuation));
386 callback_factory_.NewCallback(&Plugin::NexeDidCrash));
387 } 377 }
388 378
389 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) { 379 void Plugin::BitcodeDidTranslateContinuation(int32_t pp_error) {
390 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n"); 380 NaClLog(4, "Entered BitcodeDidTranslateContinuation\n");
391 UNREFERENCED_PARAMETER(pp_error); 381 UNREFERENCED_PARAMETER(pp_error);
392 if (LoadNaClModuleContinuationIntern()) { 382 if (LoadNaClModuleContinuationIntern()) {
393 int64_t loaded; 383 int64_t loaded;
394 int64_t total; 384 int64_t total;
395 // TODO(teravest): Tighten this up so we can get rid of 385 // TODO(teravest): Tighten this up so we can get rid of
396 // GetCurrentProgress(). loaded should always equal total. 386 // GetCurrentProgress(). loaded should always equal total.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 error_info.message().c_str()); 433 error_info.message().c_str());
444 } 434 }
445 435
446 bool Plugin::DocumentCanRequest(const std::string& url) { 436 bool Plugin::DocumentCanRequest(const std::string& url) {
447 CHECK(pp::Module::Get()->core()->IsMainThread()); 437 CHECK(pp::Module::Get()->core()->IsMainThread());
448 CHECK(pp::URLUtil_Dev::Get() != NULL); 438 CHECK(pp::URLUtil_Dev::Get() != NULL);
449 return pp::URLUtil_Dev::Get()->DocumentCanRequest(this, pp::Var(url)); 439 return pp::URLUtil_Dev::Get()->DocumentCanRequest(this, pp::Var(url));
450 } 440 }
451 441
452 } // namespace plugin 442 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/plugin.h ('k') | ppapi/native_client/src/trusted/plugin/service_runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698