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 |
deleted file mode 100644 |
index 2b7ead0215233a4924d2fa1d743f99e6cae0b38a..0000000000000000000000000000000000000000 |
--- a/src/trusted/manifest_name_service_proxy/manifest_proxy.c |
+++ /dev/null |
@@ -1,390 +0,0 @@ |
-/* |
- * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#define NACL_LOG_MODULE_NAME "manifest_proxy" |
- |
-#include <string.h> |
- |
-#include "native_client/src/trusted/manifest_name_service_proxy/manifest_proxy.h" |
- |
-#include "native_client/src/public/name_service.h" |
-#include "native_client/src/public/nacl_file_info.h" |
-#include "native_client/src/shared/platform/nacl_log.h" |
-#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/desc_cacheability/desc_cacheability.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/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) { |
- NaClLog(4, "Entered NaClManifestWaitForChannel_yield_mu\n"); |
- NaClXMutexLock(&self->mu); |
- NaClLog(4, "NaClManifestWaitForChannel_yield_mu: checking channel\n"); |
- while (!self->channel_initialized) { |
- NaClLog(4, "NaClManifestWaitForChannel_yield_mu: waiting\n"); |
- NaClXCondVarWait(&self->cv, &self->mu); |
- } |
- NaClLog(4, "Leaving NaClManifestWaitForChannel_yield_mu\n"); |
-} |
- |
-static void NaClManifestReleaseChannel_release_mu( |
- struct NaClManifestProxyConnection *self) { |
- NaClLog(4, "NaClManifestReleaseChannel_release_mu\n"); |
- NaClXMutexUnlock(&self->mu); |
-} |
- |
-static void NaClManifestNameServiceInsertRpc( |
- struct NaClSrpcRpc *rpc, |
- struct NaClSrpcArg **in_args, |
- struct NaClSrpcArg **out_args, |
- struct NaClSrpcClosure *done_cls) { |
- |
- UNREFERENCED_PARAMETER(in_args); |
- NaClLog(4, "NaClManifestNameServiceInsertRpc\n"); |
- out_args[0]->u.ival = NACL_NAME_SERVICE_PERMISSION_DENIED; |
- /* cannot add names to the manifest! */ |
- rpc->result = NACL_SRPC_RESULT_OK; |
- (*done_cls->Run)(done_cls); |
-} |
- |
-static void NaClManifestNameServiceLookupRpc( |
- struct NaClSrpcRpc *rpc, |
- struct NaClSrpcArg **in_args, |
- struct NaClSrpcArg **out_args, |
- struct NaClSrpcClosure *done_cls) { |
- struct NaClManifestProxyConnection *proxy_conn = |
- (struct NaClManifestProxyConnection *) rpc->channel->server_instance_data; |
- char *name = in_args[0]->arrays.str; |
- int flags = in_args[1]->u.ival; |
- char cookie[20]; |
- uint32_t cookie_size = sizeof cookie; |
- int status; |
- struct NaClDesc *desc; |
- struct NaClFileToken file_token; |
- NaClSrpcError srpc_error; |
- |
- NaClLog(4, "NaClManifestNameServiceLookupRpc\n"); |
- |
- NaClManifestWaitForChannel_yield_mu(proxy_conn); |
- |
- NaClLog(4, |
- "NaClManifestNameServiceLookupRpc: name %s, flags %d\n", |
- name, flags); |
- NaClLog(4, |
- "NaClManifestNameServiceLookupRpc: invoking %s\n", |
- NACL_MANIFEST_LOOKUP); |
- |
- if (NACL_SRPC_RESULT_OK != |
- (srpc_error = |
- NaClSrpcInvokeBySignature(&proxy_conn->client_channel, |
- NACL_MANIFEST_LOOKUP, |
- name, |
- flags, |
- &status, |
- &desc, |
- &file_token.lo, |
- &file_token.hi, |
- &cookie_size, |
- cookie))) { |
- NaClLog(LOG_ERROR, |
- ("Manifest lookup via channel 0x%"NACL_PRIxPTR" with RPC " |
- NACL_MANIFEST_LOOKUP" failed: %d\n"), |
- (uintptr_t) &proxy_conn->client_channel, |
- srpc_error); |
- rpc->result = srpc_error; |
- } else { |
- struct NaClManifestProxy *proxy = |
- (struct NaClManifestProxy *) proxy_conn->base.server; |
- struct NaClValidationCache *validation_cache = |
- proxy->server->nap->validation_cache; |
- struct NaClDesc *replacement_desc; |
- |
- /* |
- * The cookie is used to release renderer-side pepper file handle. |
- * For now, we leak. We need on-close callbacks on NaClDesc |
- * objects to do this properly, but even that is insufficient |
- * since the manifest NaClDesc could, in principle, be transferred |
- * to another process -- we would need distributed garbage |
- * protection. If Pepper could take advantage of host-OS-side |
- * reference counting that is already done, this wouldn't be a |
- * problem. |
- */ |
- NaClLog(4, |
- "NaClManifestNameServiceLookupRpc: got cookie %.*s\n", |
- cookie_size, cookie); |
- replacement_desc = NaClExchangeFileTokenForMappableDesc(&file_token, |
- validation_cache); |
- if (NULL != replacement_desc) { |
- NaClDescUnref(desc); |
- desc = replacement_desc; |
- } |
- |
- out_args[0]->u.ival = status; |
- out_args[1]->u.hval = desc; |
- rpc->result = NACL_SRPC_RESULT_OK; |
- } |
- (*done_cls->Run)(done_cls); |
- NaClDescUnref(desc); |
- NaClManifestReleaseChannel_release_mu(proxy_conn); |
-} |
- |
-static void NaClManifestNameServiceDeleteRpc( |
- struct NaClSrpcRpc *rpc, |
- struct NaClSrpcArg **in_args, |
- struct NaClSrpcArg **out_args, |
- struct NaClSrpcClosure *done_cls) { |
- |
- UNREFERENCED_PARAMETER(in_args); |
- NaClLog(4, "NaClManifestNameServiceDeleteRpc\n"); |
- out_args[0]->u.ival = NACL_NAME_SERVICE_PERMISSION_DENIED; |
- rpc->result = NACL_SRPC_RESULT_OK; |
- (*done_cls->Run)(done_cls); |
-} |
- |
-struct NaClSrpcHandlerDesc const kNaClManifestProxyHandlers[] = { |
- { NACL_NAME_SERVICE_INSERT, NaClManifestNameServiceInsertRpc, }, |
- { NACL_NAME_SERVICE_LOOKUP, NaClManifestNameServiceLookupRpc, }, |
- { NACL_NAME_SERVICE_DELETE, NaClManifestNameServiceDeleteRpc, }, |
- { (char const *) NULL, (NaClSrpcMethod) NULL, }, |
-}; |
- |
- |
-int NaClManifestProxyCtor(struct NaClManifestProxy *self, |
- NaClThreadIfFactoryFunction thread_factory_fn, |
- void *thread_factory_data, |
- struct NaClSecureService *server) { |
- NaClLog(4, |
- ("Entered NaClManifestProxyCtor: self 0x%"NACL_PRIxPTR |
- ", client 0x%"NACL_PRIxPTR"\n"), |
- (uintptr_t) self, |
- (uintptr_t) server); |
- if (!NaClSimpleServiceCtor(&self->base, |
- kNaClManifestProxyHandlers, |
- thread_factory_fn, |
- thread_factory_data)) { |
- return 0; |
- } |
- self->server = (struct NaClSecureService *) |
- NaClRefCountRef((struct NaClRefCount *) server); |
- NACL_VTBL(NaClRefCount, self) = |
- (struct NaClRefCountVtbl *) &kNaClManifestProxyVtbl; |
- return 1; |
-} |
- |
-static void NaClManifestProxyDtor(struct NaClRefCount *vself) { |
- struct NaClManifestProxy *self = |
- (struct NaClManifestProxy *) vself; |
- |
- NaClRefCountUnref((struct NaClRefCount *) self->server); |
- |
- NACL_VTBL(NaClRefCount, self) = |
- (struct NaClRefCountVtbl *) &kNaClSimpleServiceVtbl; |
- (*NACL_VTBL(NaClRefCount, self)->Dtor)(vself); |
-} |
- |
-int NaClManifestProxyConnectionCtor(struct NaClManifestProxyConnection *self, |
- struct NaClManifestProxy *server, |
- struct NaClDesc *conn) { |
- NaClLog(4, |
- "Entered NaClManifestProxyConnectionCtor, self 0x%"NACL_PRIxPTR"\n", |
- (uintptr_t) self); |
- if (!NaClSimpleServiceConnectionCtor( |
- &self->base, |
- (struct NaClSimpleService *) server, |
- conn, |
- (void *) self)) { |
- NaClLog(4, |
- ("NaClManifestProxyConnectionCtor: base class ctor" |
- " NaClSimpleServiceConnectionCtor failed\n")); |
- return 0; |
- } |
- NaClXMutexCtor(&self->mu); |
- NaClXCondVarCtor(&self->cv); |
- self->channel_initialized = 0; |
- NACL_VTBL(NaClRefCount, self) = |
- (struct NaClRefCountVtbl *) &kNaClManifestProxyConnectionVtbl; |
- return 1; |
-} |
- |
-void NaClManifestProxyConnectionRevHandleConnect( |
- struct NaClManifestProxyConnection *self, |
- struct NaClDesc *rev) { |
- NaClLog(4, "Entered NaClManifestProxyConnectionRevHandleConnect\n"); |
- NaClXMutexLock(&self->mu); |
- if (self->channel_initialized) { |
- NaClLog(LOG_FATAL, |
- "NaClManifestProxyConnectionRevHandleConnect: double connect?\n"); |
- } |
- /* |
- * If NaClSrpcClientCtor proves to take too long, we should spin off |
- * another thread to do the initialization so that the reverse |
- * client can accept additional reverse channels. |
- */ |
- NaClLog(4, |
- "NaClManifestProxyConnectionRevHandleConnect: Creating SrpcClient\n"); |
- if (NaClSrpcClientCtor(&self->client_channel, rev)) { |
- NaClLog(4, |
- ("NaClManifestProxyConnectionRevHandleConnect: SrpcClientCtor" |
- " succeded, announcing.\n")); |
- self->channel_initialized = 1; |
- NaClXCondVarBroadcast(&self->cv); |
- /* ownership of rev taken */ |
- } else { |
- NaClLog(4, |
- ("NaClManifestProxyConnectionRevHandleConnect: NaClSrpcClientCtor" |
- " failed\n")); |
- } |
- NaClXMutexUnlock(&self->mu); |
- NaClLog(4, "Leaving NaClManifestProxyConnectionRevHandleConnect\n"); |
-} |
- |
-static void NaClManifestProxyConnectionDtor(struct NaClRefCount *vself) { |
- struct NaClManifestProxyConnection *self = |
- (struct NaClManifestProxyConnection *) vself; |
- NaClLog(4, |
- "Entered NaClManifestProxyConnectionDtor: self 0x%"NACL_PRIxPTR"\n", |
- (uintptr_t) self); |
- NaClXMutexLock(&self->mu); |
- while (!self->channel_initialized) { |
- NaClLog(4, |
- "NaClManifestProxyConnectionDtor:" |
- " waiting for connection initialization\n"); |
- NaClXCondVarWait(&self->cv, &self->mu); |
- } |
- NaClXMutexUnlock(&self->mu); |
- |
- NaClLog(4, "NaClManifestProxyConnectionDtor: dtoring\n"); |
- |
- NaClCondVarDtor(&self->cv); |
- NaClMutexDtor(&self->mu); |
- |
- NaClSrpcDtor(&self->client_channel); |
- NACL_VTBL(NaClSimpleServiceConnection, self) = |
- &kNaClSimpleServiceConnectionVtbl; |
- (*NACL_VTBL(NaClRefCount, self)->Dtor)(vself); |
-} |
- |
-/* |
- * NaClManifestProxyConnection is a NaClSimpleServiceConnection |
- */ |
-struct NaClSimpleServiceConnectionVtbl |
- const kNaClManifestProxyConnectionVtbl = { |
- { |
- NaClManifestProxyConnectionDtor, |
- }, |
- NaClSimpleServiceConnectionServerLoop, |
-}; |
- |
-static void NaClManifestReverseClientCallback( |
- void *state, |
- struct NaClThreadInterface *tif, |
- struct NaClDesc *new_conn) { |
- struct NaClManifestProxyConnection *mconn = |
- (struct NaClManifestProxyConnection *) state; |
- |
- UNREFERENCED_PARAMETER(tif); |
- NaClLog(4, "Entered NaClManifestReverseClientCallback\n"); |
- NaClManifestProxyConnectionRevHandleConnect(mconn, new_conn); |
-} |
- |
-int NaClManifestProxyConnectionFactory( |
- struct NaClSimpleService *vself, |
- struct NaClDesc *conn, |
- struct NaClSimpleServiceConnection **out) { |
- struct NaClManifestProxy *self = |
- (struct NaClManifestProxy *) vself; |
- struct NaClManifestProxyConnection *mconn; |
- NaClSrpcError rpc_result; |
- int bool_status; |
- |
- NaClLog(4, |
- ("Entered NaClManifestProxyConnectionFactory, self 0x%"NACL_PRIxPTR |
- "\n"), |
- (uintptr_t) self); |
- mconn = (struct NaClManifestProxyConnection *) malloc(sizeof *mconn); |
- if (NULL == mconn) { |
- NaClLog(4, "NaClManifestProxyConnectionFactory: no memory\n"); |
- return -NACL_ABI_ENOMEM; |
- } |
- NaClLog(4, "NaClManifestProxyConnectionFactory: creating connection obj\n"); |
- if (!NaClManifestProxyConnectionCtor(mconn, self, conn)) { |
- free(mconn); |
- return -NACL_ABI_EIO; |
- } |
- |
- /* |
- * Construct via NaClSecureReverseClientCtor with a callback to |
- * process the new reverse connection -- which should be stored in |
- * the mconn object. |
- * |
- * Make reverse RPC to obtain a new reverse RPC connection. |
- */ |
- NaClLog(4, "NaClManifestProxyConnectionFactory: locking reverse channel\n"); |
- NaClLog(4, "NaClManifestProxyConnectionFactory: client 0x%"NACL_PRIxPTR"\n", |
- (uintptr_t) self->server); |
- NaClXMutexLock(&self->server->mu); |
- if (NACL_REVERSE_CHANNEL_INITIALIZED != |
- self->server->reverse_channel_initialization_state) { |
- NaClLog(LOG_FATAL, |
- "NaClManifestProxyConnectionFactory invoked w/o reverse channel\n"); |
- } |
- NaClLog(4, "NaClManifestProxyConnectionFactory: inserting handler\n"); |
- if (!(*NACL_VTBL(NaClSecureReverseClient, self->server->reverse_client)-> |
- InsertHandler)(self->server->reverse_client, |
- NaClManifestReverseClientCallback, |
- (void *) mconn)) { |
- NaClLog(LOG_FATAL, |
- ("NaClManifestProxyConnectionFactory:" |
- " NaClSecureReverseClientInsertHandler failed\n")); |
- } |
- /* |
- * NaClSrpcInvokeBySignature(""); tell plugin to connect and create |
- * a reverse channel |
- */ |
- NaClLog(4, |
- ("NaClManifestProxyConnectionFactory: making RPC" |
- " to set up connection\n")); |
- rpc_result = NaClSrpcInvokeBySignature(&self->server->reverse_channel, |
- NACL_REVERSE_CONTROL_ADD_CHANNEL, |
- &bool_status); |
- if (NACL_SRPC_RESULT_OK != rpc_result) { |
- NaClLog(LOG_FATAL, |
- "NaClManifestProxyConnectionFactory: add channel RPC failed: %d", |
- rpc_result); |
- } |
- NaClLog(4, |
- "NaClManifestProxyConnectionFactory: Start status %d\n", bool_status); |
- |
- NaClXMutexUnlock(&self->server->mu); |
- |
- *out = (struct NaClSimpleServiceConnection *) mconn; |
- return 0; |
-} |
- |
-struct NaClSimpleServiceVtbl const kNaClManifestProxyVtbl = { |
- { |
- NaClManifestProxyDtor, |
- }, |
- NaClManifestProxyConnectionFactory, |
- /* see name_service.c vtbl for connection factory and ownership */ |
- /* |
- * The NaClManifestProxyConnectionFactory creates a subclass of a |
- * NaClSimpleServiceConnectionFactory object that uses the reverse |
- * connection object self->server to obtain a new RPC channel |
- * with each manifest connection. |
- */ |
- NaClSimpleServiceAcceptConnection, |
- NaClSimpleServiceAcceptAndSpawnHandler, |
- NaClSimpleServiceRpcHandler, |
-}; |