Index: src/trusted/service_runtime/sel_main_chrome.c |
diff --git a/src/trusted/service_runtime/sel_main_chrome.c b/src/trusted/service_runtime/sel_main_chrome.c |
index c4a013e802cdde0a7cab5e50c098101ee0fa0ff3..6c3d304f1967236879537367a812c0a2f723f6fa 100644 |
--- a/src/trusted/service_runtime/sel_main_chrome.c |
+++ b/src/trusted/service_runtime/sel_main_chrome.c |
@@ -107,6 +107,7 @@ struct NaClChromeMainArgs *NaClChromeMainArgsCreate(void) { |
args->broker_duplicate_handle_func = NULL; |
args->attach_debug_exception_handler_func = NULL; |
#endif |
+ args->load_status_handler_func = NULL; |
#if NACL_LINUX || NACL_OSX |
args->number_of_cores = -1; /* unknown */ |
#endif |
@@ -371,12 +372,41 @@ static int LoadApp(struct NaClApp *nap, struct NaClChromeMainArgs *args) { |
#endif |
} |
+ if (args->load_status_handler_func != NULL) { |
+ args->load_status_handler_func(LOAD_OK); |
+ } |
return LOAD_OK; |
done: |
fflush(stdout); |
/* |
+ * If there is a load status callback, call that now and transfer logs |
+ * in preparation for process exit. |
+ */ |
+ if (args->load_status_handler_func != NULL) { |
+ /* Don't return LOAD_OK if we had some failure loading. */ |
+ if (LOAD_OK == errcode) { |
+ errcode = LOAD_INTERNAL; |
+ } |
+ args->load_status_handler_func(errcode); |
+ NaClLog(LOG_ERROR, "NaCl LoadApp failed. Transferring logs before exit.\n"); |
+ NaClLogRunAbortBehavior(); |
+ /* |
+ * Fall through and run NaClBlockIfCommandChannelExists. |
+ * TODO(jvoung): remove NaClBlockIfCommandChannelExists() and use the |
+ * callback to indicate the load_status after Chromium no longer calls |
+ * start_module. We also need to change Chromium so that it does not |
+ * attempt to set up the command channel if there is a known load error. |
+ * Otherwise there is a race between this process's exit / load error |
+ * reporting, and the command channel setup on the Chromium side (plus |
+ * the associated reporting). Thus this could end up with two different |
+ * load errors being reported (1) the real load error from here, and |
+ * (2) the command channel setup failure because the process exited in |
+ * the middle of setting up the command channel. |
+ */ |
+ } |
+ /* |
* If there is a secure command channel, we sent an RPC reply with |
* the reason that the nexe was rejected. If we exit now, that |
* reply may still be in-flight and the various channel closure (esp |