Index: src/trusted/manifest_name_service_proxy/manifest_proxy.c |
diff --git a/src/trusted/manifest_name_service_proxy/manifest_proxy.c b/src/trusted/manifest_name_service_proxy/manifest_proxy.c |
index 78d60d7defecd00a42c461deca89147fc3499bb3..3cadf04a00824a3bb9735b694da2040e7b8f09ec 100644 |
--- a/src/trusted/manifest_name_service_proxy/manifest_proxy.c |
+++ b/src/trusted/manifest_name_service_proxy/manifest_proxy.c |
@@ -12,11 +12,15 @@ |
#include "native_client/src/shared/platform/nacl_sync.h" |
#include "native_client/src/shared/platform/nacl_sync_checked.h" |
#include "native_client/src/shared/srpc/nacl_srpc.h" |
+#include "native_client/src/trusted/desc/nacl_desc_io.h" |
#include "native_client/src/trusted/reverse_service/manifest_rpc.h" |
#include "native_client/src/trusted/reverse_service/reverse_control_rpc.h" |
#include "native_client/src/trusted/service_runtime/include/sys/errno.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" |
#include "native_client/src/trusted/service_runtime/include/sys/nacl_name_service.h" |
#include "native_client/src/trusted/service_runtime/nacl_secure_service.h" |
+#include "native_client/src/trusted/validator/rich_file_info.h" |
+#include "native_client/src/trusted/validator/validation_cache.h" |
static void NaClManifestWaitForChannel_yield_mu( |
struct NaClManifestProxyConnection *self) { |
@@ -108,6 +112,7 @@ static void NaClManifestNameServiceLookupRpc( |
uint32_t cookie_size = sizeof cookie; |
int status; |
struct NaClDesc *desc; |
+ uint64_t nonce; |
NaClSrpcError srpc_error; |
NaClLog(4, "NaClManifestNameServiceLookupRpc\n"); |
@@ -129,6 +134,7 @@ static void NaClManifestNameServiceLookupRpc( |
flags, |
&status, |
&desc, |
+ &nonce, |
&cookie_size, |
cookie))) { |
NaClLog(LOG_ERROR, |
@@ -138,9 +144,44 @@ static void NaClManifestNameServiceLookupRpc( |
srpc_error); |
rpc->result = srpc_error; |
} else { |
+ struct NaClManifestProxy *proxy = |
+ (struct NaClManifestProxy *) proxy_conn->base.server; |
+ struct NaClValidationCache *validation_cache = proxy->nap->validation_cache; |
+ int32_t new_fd; |
+ char *file_path; |
+ uint32_t file_path_length; |
+ |
NaClLog(4, |
"NaClManifestNameServiceLookupRpc: got cookie %.*s\n", |
cookie_size, cookie); |
+ |
+ if (nonce != 0 && validation_cache->ResolveFileNonce != NULL && |
+ validation_cache->ResolveFileNonce(validation_cache->handle, nonce, |
+ &new_fd, &file_path, |
+ &file_path_length)) { |
+ struct RichFileInfo info; |
+ uint32_t flags; |
+ /* |
+ * We don't entirely trust the render process, so swap the handle with one |
+ * from the browser process that should be equivalent. |
+ */ |
+ NaClDescUnref(desc); |
+ desc = NaClDescIoDescFromHandleAllocCtor((NaClHandle) new_fd, |
Nick Bray (chromium)
2013/05/10 22:54:56
Question: is there a better cross-platform way to
bsy
2013/05/10 23:52:56
We can add a better interface to wrap up the compo
|
+ NACL_ABI_O_RDONLY); |
+ |
+ /* Mark the desc as OK for mmaping. */ |
+ flags = NaClDescGetFlags(desc); |
+ NaClDescSetFlags(desc, flags | NACL_DESC_FLAGS_MMAP_EXEC_OK); |
+ |
+ /* Provide metadata for validation. */ |
+ RichFileInfoCtor(&info); |
+ info.known_file = 1; |
+ info.file_path = file_path; /* Takes ownership. */ |
+ info.file_path_length = file_path_length; |
+ SetFileOriginInfo(desc, &info); |
+ RichFileInfoDtor(&info); |
+ } |
+ |
out_args[0]->u.ival = status; |
out_args[1]->u.hval = desc; |
rpc->result = NACL_SRPC_RESULT_OK; |