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 89e7f3054dfd8633ee286574fa99ab0aee09c9d2..1a214371d7f33667505089afedced3a064bde183 100644 |
--- a/src/trusted/service_runtime/sel_main_chrome.c |
+++ b/src/trusted/service_runtime/sel_main_chrome.c |
@@ -43,6 +43,8 @@ |
#include "native_client/src/trusted/service_runtime/win/exception_patch/ntdll_patch.h" |
#include "native_client/src/trusted/validator/validation_metadata.h" |
+static void NaClCleanupAndExit(struct NaClApp *nap, NaClErrorCode errcode); |
+ |
struct NaClChromeMainArgs *NaClChromeMainArgsCreate(void) { |
struct NaClChromeMainArgs *args = malloc(sizeof(*args)); |
if (args == NULL) |
@@ -124,27 +126,11 @@ static void NaClLoadIrt(struct NaClApp *nap, int irt_fd) { |
NaClDescUnref(nd); |
} |
-void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
- char *av[1]; |
- int ac = 1; |
- const char **envp; |
- struct NaClApp state; |
- struct NaClApp *nap = &state; |
+struct NaClApp *NaClChromeMainCreateApp(struct NaClChromeMainArgs *args) { |
+ struct NaClApp *nap = (struct NaClApp *)malloc(sizeof(struct NaClApp)); |
NaClErrorCode errcode = LOAD_INTERNAL; |
- int ret_code = 1; |
- struct NaClEnvCleanser env_cleanser; |
int skip_qualification; |
-#if NACL_OSX |
- /* Mac dynamic libraries cannot access the environ variable directly. */ |
- envp = (const char **) *_NSGetEnviron(); |
-#else |
- /* Overzealous code style check is overzealous. */ |
- /* @IGNORE_LINES_FOR_CODE_HYGIENE[1] */ |
- extern char **environ; |
- envp = (const char **) environ; |
-#endif |
- |
#if NACL_LINUX || NACL_OSX |
/* This needs to happen before NaClAllModulesInit(). */ |
if (args->urandom_fd != -1) |
@@ -155,17 +141,16 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
* Clear state so that NaClBootstrapChannelErrorReporter will be |
* able to know if the bootstrap channel is available or not. |
*/ |
- memset(&state, 0, sizeof state); |
+ memset(nap, 0, sizeof(struct NaClApp)); |
NaClAllModulesInit(); |
NaClBootstrapChannelErrorReporterInit(); |
- NaClErrorLogHookInit(NaClBootstrapChannelErrorReporter, &state); |
- |
- /* to be passed to NaClMain, eventually... */ |
- av[0] = "NaClMain"; |
+ NaClErrorLogHookInit(NaClBootstrapChannelErrorReporter, nap); |
- if (NACL_FI_ERROR_COND("AppCtor", !NaClAppCtor(&state))) { |
+ if (NACL_FI_ERROR_COND("AppCtor", !NaClAppCtor(nap))) { |
NaClLog(LOG_FATAL, "Error while constructing app state\n"); |
- goto done; |
+ NaClCleanupAndExit(nap, errcode); |
+ free(nap); |
+ return NULL; |
} |
errcode = LOAD_OK; |
@@ -269,7 +254,7 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
#endif |
/* Give debuggers a well known point at which xlate_base is known. */ |
- NaClGdbHook(&state); |
+ NaClGdbHook(nap); |
NaClCreateServiceSocket(nap); |
/* |
@@ -298,6 +283,42 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
NaClLog(4, "secure service = %"NACL_PRIxPTR"\n", |
(uintptr_t) nap->secure_service); |
+ |
+ if (args->enable_debug_stub) { |
+#if NACL_LINUX || NACL_OSX |
+ if (args->debug_stub_server_bound_socket_fd != NACL_INVALID_SOCKET) { |
+ NaClDebugSetBoundSocket(args->debug_stub_server_bound_socket_fd); |
+ } |
+#endif |
+ if (!NaClDebugInit(nap)) { |
+ NaClCleanupAndExit(nap, errcode); |
+ free(nap); |
+ return NULL; |
+ } |
+ } |
+ |
+ free(args); |
+ return nap; |
+} |
+ |
+void NaClChromeMainLoadAndRunNexe(struct NaClApp *nap, int irt_fd) { |
+ char *av[1]; |
+ int ac = 1; |
+ int ret_code = 1; |
+ NaClErrorCode errcode = LOAD_OK; |
+ struct NaClEnvCleanser env_cleanser; |
+ const char **envp; |
+ |
+#if NACL_OSX |
+ /* Mac dynamic libraries cannot access the environ variable directly. */ |
+ envp = (const char **) *_NSGetEnviron(); |
+#else |
+ /* Overzealous code style check is overzealous. */ |
+ /* @IGNORE_LINES_FOR_CODE_HYGIENE[1] */ |
+ extern char **environ; |
+ envp = (const char **) environ; |
+#endif |
+ |
NACL_FI_FATAL("BeforeWaitForStartModule"); |
if (NULL != nap->secure_service) { |
@@ -306,9 +327,7 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
* wait for start_module RPC call on secure channel thread. |
*/ |
start_result = NaClWaitForStartModuleCommand(nap); |
- if (LOAD_OK == errcode) { |
- errcode = start_result; |
- } |
+ errcode = start_result; |
} |
NACL_FI_FATAL("BeforeLoadIrt"); |
@@ -317,14 +336,15 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
* error reporting done; can quit now if there was an error earlier. |
*/ |
if (LOAD_OK != errcode) { |
- goto done; |
+ NaClCleanupAndExit(nap, errcode); |
+ return; |
} |
/* |
* Load the integrated runtime (IRT) library. |
*/ |
- if (args->irt_fd != -1 && !nap->irt_loaded) { |
- NaClLoadIrt(nap, args->irt_fd); |
+ if (irt_fd != -1 && !nap->irt_loaded) { |
+ NaClLoadIrt(nap, irt_fd); |
nap->irt_loaded = 1; |
} |
@@ -340,19 +360,8 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
NaClLog(LOG_FATAL, "Launch service threads failed\n"); |
} |
- if (args->enable_debug_stub) { |
-#if NACL_LINUX || NACL_OSX |
- if (args->debug_stub_server_bound_socket_fd != NACL_INVALID_SOCKET) { |
- NaClDebugSetBoundSocket(args->debug_stub_server_bound_socket_fd); |
- } |
-#endif |
- if (!NaClDebugInit(nap)) { |
- goto done; |
- } |
- } |
- |
- free(args); |
- args = NULL; |
+ /* to be passed to NaClMain, eventually... */ |
+ av[0] = "NaClMain"; |
if (NACL_FI_ERROR_COND( |
"CreateMainThread", |
@@ -386,8 +395,9 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
* before we clean up the address space. |
*/ |
NaClExit(ret_code); |
+} |
- done: |
+static void NaClCleanupAndExit(struct NaClApp *nap, NaClErrorCode errcode) { |
fflush(stdout); |
/* |
@@ -404,5 +414,13 @@ void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
NaClAllModulesFini(); |
- NaClExit(ret_code); |
+ NaClExit(1); |
+} |
+ |
+void NaClChromeMainStart(struct NaClChromeMainArgs *args) { |
+ int irt_fd = args->irt_fd; |
+ struct NaClApp *nap = NaClChromeMainCreateApp(args); |
+ if (NULL != nap) { |
+ NaClChromeMainLoadAndRunNexe(nap, irt_fd); |
+ } |
} |