Index: src/trusted/service_runtime/sel_ldr.c |
=================================================================== |
--- src/trusted/service_runtime/sel_ldr.c (revision 7373) |
+++ src/trusted/service_runtime/sel_ldr.c (working copy) |
@@ -44,6 +44,7 @@ |
#include "native_client/src/trusted/service_runtime/nacl_app_thread.h" |
#include "native_client/src/trusted/service_runtime/nacl_desc_effector_ldr.h" |
#include "native_client/src/trusted/service_runtime/nacl_globals.h" |
+#include "native_client/src/trusted/service_runtime/nacl_resource.h" |
#include "native_client/src/trusted/service_runtime/nacl_syscall_common.h" |
#include "native_client/src/trusted/service_runtime/nacl_syscall_handlers.h" |
#include "native_client/src/trusted/service_runtime/nacl_valgrind_hooks.h" |
@@ -142,6 +143,10 @@ |
nap->secure_service = NULL; |
nap->manifest_proxy = NULL; |
nap->kern_service = NULL; |
+ nap->resource_phase = NACL_RESOURCE_PHASE_START; |
+ if (!NaClResourceNaClAppInit(&nap->resources, nap)) { |
+ goto cleanup_dynamic_load_mutex; |
+ } |
nap->reverse_client = NULL; |
nap->reverse_channel_initialization_state = |
NACL_REVERSE_CHANNEL_UNINITIALIZED; |
@@ -659,6 +664,50 @@ |
NaClSetDesc(nap, nacl_desc, (struct NaClDesc *) dp); |
} |
+ |
+static void NaClProcessRedirControl(struct NaClApp *nap) { |
+ static struct { |
+ int d; |
+ char const *env_name; |
+ int nacl_flags; |
+ int mode; |
+ } redir_control[] = { |
+ { 0, "NACL_EXE_STDIN", |
+ NACL_ABI_O_RDONLY, 0, }, |
+ { 1, "NACL_EXE_STDOUT", |
+ NACL_ABI_O_WRONLY | NACL_ABI_O_APPEND, 0777, }, |
+ { 2, "NACL_EXE_STDERR", |
+ NACL_ABI_O_WRONLY | NACL_ABI_O_APPEND, 0777, }, |
+ }; |
+ |
+ size_t ix; |
+ char const *env; |
+ struct NaClDesc *ndp; |
+ |
+ for (ix = 0; ix < NACL_ARRAY_SIZE(redir_control); ++ix) { |
+ if (NULL != (env = getenv(redir_control[ix].env_name))) { |
+ NaClLog(4, "getenv(%s) -> %s\n", redir_control[ix].env_name, env); |
+ ndp = NaClResourceOpen((struct NaClResource *) &nap->resources, |
+ env, |
+ redir_control[ix].nacl_flags, |
+ redir_control[ix].mode); |
+ NaClLog(4, " NaClResourceOpen returned %"NACL_PRIxPTR"\n", |
+ (uintptr_t) ndp); |
+ if (NULL != ndp) { |
+ NaClLog(4, "Setting descriptor %d\n", (int) ix); |
+ NaClSetDesc(nap, (int) ix, ndp); |
+ ndp = NULL; |
+ } |
+ } else if (NACL_RESOURCE_PHASE_START == nap->resource_phase) { |
+ /* |
+ * Environment not set -- handle default inheritance. |
+ */ |
+ NaClAddHostDescriptor(nap, DUP(redir_control[ix].d), |
+ redir_control[ix].nacl_flags, (int) ix); |
+ } |
+ } |
+} |
+ |
/* |
* Process default descriptor inheritance. This means dup'ing |
* descriptors 0-2 and making them available to the NaCl App. |
@@ -673,36 +722,11 @@ |
* in debug mode. |
*/ |
void NaClAppInitialDescriptorHookup(struct NaClApp *nap) { |
- static struct { |
- int d; |
- char const *env_name; |
- int flags; |
- int mode; |
- int nacl_flags; |
- } redir_control[] = { |
- { 0, "NACL_EXE_STDIN", O_RDONLY, 0, |
- NACL_ABI_O_RDONLY, }, |
- { 1, "NACL_EXE_STDOUT", O_WRONLY | O_APPEND | O_CREAT, 0777, |
- NACL_ABI_O_WRONLY | NACL_ABI_O_APPEND, }, |
- { 2, "NACL_EXE_STDERR", O_WRONLY | O_APPEND | O_CREAT, 0777, |
- NACL_ABI_O_WRONLY | NACL_ABI_O_APPEND, }, |
- }; |
- size_t ix; |
- char *env; |
- int d; |
- |
- for (ix = 0; ix < NACL_ARRAY_SIZE(redir_control); ++ix) { |
- d = -1; |
- if (NULL != (env = getenv(redir_control[ix].env_name))) { |
- d = open(env, redir_control[ix].flags, redir_control[ix].mode); |
- /* may return -1, esp sandbox */ |
- } |
- if (-1 == d) { |
- d = DUP(redir_control[ix].d); |
- } |
- NaClAddHostDescriptor(nap, d, redir_control[ix].nacl_flags, (int) ix); |
- } |
+ NaClLog(4, "Processing I/O redirection/inheritance from environment\n"); |
+ nap->resource_phase = NACL_RESOURCE_PHASE_START; |
+ NaClProcessRedirControl(nap); |
+ NaClLog(4, "... done.\n"); |
} |
void NaClAppVmmapUpdate(struct NaClApp *nap, |
@@ -914,6 +938,7 @@ |
case NACL_DESC_IMC_SOCKET: |
case NACL_DESC_QUOTA: |
case NACL_DESC_DEVICE_RNG: |
+ case NACL_DESC_DEVICE_POSTMESSAGE: |
/* Unsupported stuff */ |
rpc->result = NACL_SRPC_RESULT_APP_ERROR; |
goto cleanup; |
@@ -1302,6 +1327,17 @@ |
rpc->result = NACL_SRPC_RESULT_OK; |
/* |
+ * Hook up reverse-channel enabled resources, e.g., |
+ * DEBUG_ONLY:dev://postmessage. NB: Resources specified by |
+ * file:path should have been taken care of earlier, in |
+ * NaClAppInitialDescriptorHookup. |
+ */ |
+ nap->resource_phase = NACL_RESOURCE_PHASE_REV_CHAN; |
+ NaClLog(4, "Processing dev I/O redirection/inheritance from environment\n"); |
+ NaClProcessRedirControl(nap); |
+ NaClLog(4, "... done.\n"); |
+ |
+ /* |
* Service thread takes the reference rev. |
*/ |
if (!NaClSimpleRevClientStartServiceThread(&rev->base)) { |