| 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..4129ff63bda588514f800ea40189d971538a5da4 100644
|
| --- a/src/trusted/service_runtime/sel_main_chrome.c
|
| +++ b/src/trusted/service_runtime/sel_main_chrome.c
|
| @@ -44,6 +44,7 @@
|
| static int g_initialized = 0;
|
|
|
| static void (*g_fatal_error_handler)(const char *data, size_t bytes) = NULL;
|
| +static void (*g_load_status_callback)(int load_status) = NULL;
|
|
|
| static const int default_argc = 1;
|
| static const char *const default_argv[1] = {"NaClMain"};
|
| @@ -76,6 +77,13 @@ void NaClSetFatalErrorCallback(void (*func)(const char *data, size_t bytes)) {
|
| NaClErrorLogHookInit(NaClFatalErrorHandlerCallback, NULL);
|
| }
|
|
|
| +void NaClSetLoadStatusCallback(void (*func)(int load_status)) {
|
| + CHECK(g_initialized);
|
| + if (g_load_status_callback != NULL)
|
| + NaClLog(LOG_FATAL, "NaClSetLoadStatusCallback called twice.\n");
|
| + g_load_status_callback = func;
|
| +}
|
| +
|
| struct NaClChromeMainArgs *NaClChromeMainArgsCreate(void) {
|
| struct NaClChromeMainArgs *args;
|
|
|
| @@ -371,17 +379,35 @@ static int LoadApp(struct NaClApp *nap, struct NaClChromeMainArgs *args) {
|
| #endif
|
| }
|
|
|
| + if (g_load_status_callback != NULL) {
|
| + g_load_status_callback(LOAD_OK);
|
| + }
|
| return LOAD_OK;
|
|
|
| done:
|
| fflush(stdout);
|
|
|
| /*
|
| - * 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
|
| - * reverse channel) may be detected first. This would result in a
|
| - * crash being reported, rather than the error in the RPC reply.
|
| + * If there is a load_status_callback, call that now. TODO(jvoung): remove
|
| + * NaClBlockIfCommandChannelExists() and just call g_load_status_callback
|
| + * to indicate the load_status.
|
| + */
|
| + if (g_load_status_callback != NULL) {
|
| + /* Don't return LOAD_OK if we had some failure loading. */
|
| + if (LOAD_OK == errcode) {
|
| + errcode = LOAD_INTERNAL;
|
| + }
|
| + g_load_status_callback(errcode);
|
| + NaClLog(LOG_ERROR, "reap logs\n");
|
| + NaClLogRunAbortBehavior();
|
| + return errcode;
|
| + }
|
| + /*
|
| + * If there is no load_status_callback, but 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 reverse channel) may be detected first. This would
|
| + * result in a crash being reported, rather than the error in the RPC reply.
|
| * Instead, we wait for the hard-shutdown on the command channel.
|
| */
|
| if (LOAD_OK != errcode) {
|
|
|