int NaClReverseThreadIfCtor_protected(
    struct NaClReverseCountingThreadInterface   *self,
    void                                        *factory_data,
    NaClThreadIfStartFunction                   fn_ptr,
    void                                        *thread_data,
    size_t                                      thread_stack_size) {
  struct NaClReverseService *nrsp = (struct NaClReverseService *) factory_data;

  NaClLog(3, "Entered NaClReverseThreadIfCtor_protected\n");
  if (!NaClThreadInterfaceCtor_protected(
          (struct NaClThreadInterface *) self,
          NaClReverseThreadIfFactoryFn,
          NaClRefCountRef((struct NaClRefCount *) nrsp),
          fn_ptr,
          thread_data,
          thread_stack_size)) {
    NaClLog(4, "NaClThreadInterfaceCtor_protected failed\n");
    NaClRefCountUnref((struct NaClRefCount *) nrsp);
    return 0;
  }

  self->reverse_service = nrsp;
  (*NACL_VTBL(NaClReverseService, nrsp)->ThreadCountIncr)(nrsp);

  NACL_VTBL(NaClRefCount, self) =
      (struct NaClRefCountVtbl *) &kNaClReverseThreadInterfaceVtbl;

  NaClLog(3, "Leaving NaClAddrSpSquattingThreadIfCtor_protected\n");
  return 1;
}
int NaClSimpleServiceConnectionCtor(
    struct NaClSimpleServiceConnection  *self,
    struct NaClSimpleService            *server,
    struct NaClDesc                     *conn,
    void                                *instance_data) {
  NaClLog(4,
          "NaClSimpleServiceConnectionCtor: self 0x%"NACL_PRIxPTR"\n",
          (uintptr_t) self);
  if (!NaClRefCountCtor((struct NaClRefCount *) self)) {
    return 0;
  }
  self->server = (struct NaClSimpleService *) NaClRefCountRef(
      (struct NaClRefCount *) server);
  self->connected_socket = (struct NaClDesc *) NaClRefCountRef(
      (struct NaClRefCount *) conn);
  self->instance_data = instance_data;

  self->thread = NULL;

  self->base.vtbl = (struct NaClRefCountVtbl const *)
      &kNaClSimpleServiceConnectionVtbl;
  return 1;
}
int NaClDescPostMessageCtor(struct NaClDescPostMessage      *self,
                            struct NaClRuntimeHostInterface *runtime_host) {
  NaClLog(4, "Entered NaClDescPostMessageCtor\n");
  NACL_VTBL(NaClRefCount, self) = (struct NaClRefCountVtbl const *) NULL;
  if (!NaClDescCtor(&self->base)) {
    NaClLog(4, "Leaving NaClDescPostMessageCtor: failed\n");
    return 0;
  }
  self->runtime_host = (struct NaClRuntimeHostInterface *)
      NaClRefCountRef((struct NaClRefCount *) runtime_host);
  NACL_VTBL(NaClRefCount, self) =
      (struct NaClRefCountVtbl const *) &kNaClDescPostMessageVtbl;
  NaClLog(4, " Write vfptr = %"NACL_PRIxPTR"\n",
          (uintptr_t) NACL_VTBL(NaClDesc, self)->Write);
  NaClLog(4, "Leaving NaClDescPostMessageCtor: success\n");
  return 1;
}
int NaClReverseHostInterfaceCtor(
    struct NaClReverseHostInterface *self,
    struct NaClSecureService        *server) {
  NaClLog(4, "NaClReverseHostInterfaceCtor:"
          "self 0x%"NACL_PRIxPTR", server 0x%"NACL_PRIxPTR"\n",
          (uintptr_t) self, (uintptr_t) server);

  if (!NaClRuntimeHostInterfaceCtor_protected(&self->base)) {
    NaClLog(3, "NaClReverseHostInterfaceCtor: "
            "NaClRuntimeHostInterfaceCtor base class ctor failed\n");
    return 0;
  }
  self->server = (struct NaClSecureService *)
      NaClRefCountRef((struct NaClRefCount *) server);
  NACL_VTBL(NaClRefCount, self) =
      (struct NaClRefCountVtbl const *) &kNaClReverseHostInterfaceVtbl;
  return 1;
}
int NaClSimpleServiceStartServiceThread(struct NaClSimpleService *server) {
  NaClLog(4, "NaClSimpleServiceStartServiceThread: spawning thread\n");
  CHECK(server->acceptor == NULL);

  if (!NaClThreadInterfaceConstructAndStartThread(
          server->thread_factory_fn,
          server->thread_factory_data,
          AcceptThread,
          NaClRefCountRef(&server->base),
          NACL_KERN_STACK_SIZE,
          &server->acceptor)) {
    NaClLog(4, "NaClSimpleServiceStartServiceThread: no thread\n");
    NaClRefCountUnref(&server->base);  /* undo ref in Ctor call arglist */
    return 0;
  }
  NaClLog(4, "NaClSimpleServiceStartServiceThread: success\n");
  return 1;
}
int NaClReverseServiceCtor(struct NaClReverseService    *self,
                           struct NaClReverseInterface  *iface,
                           struct NaClDesc              *conn_cap) {
  int retval = 0; /* fail */

  CHECK(iface != NULL);

  NaClLog(4, "Entered NaClReverseServiceCtor\n");
  if (!NaClSimpleRevServiceCtor(&self->base,
                                conn_cap,
                                kNaClReverseServiceHandlers,
                                NaClReverseThreadIfFactoryFn,
                                (void *) self)) {
    NaClLog(4, "NaClReverseServiceCtor: NaClSimpleRevServiceCtor failed\n");
    goto done;
  }
  NACL_VTBL(NaClRefCount, self) = (struct NaClRefCountVtbl *)
      &kNaClReverseServiceVtbl;
  if (!NaClMutexCtor(&self->mu)) {
    NaClLog(4, "NaClMutexCtor failed\n");
    goto mutex_ctor_fail;
  }
  if (!NaClCondVarCtor(&self->cv)) {
    NaClLog(4, "NaClCondVar failed\n");
    goto condvar_ctor_fail;
  }
  /* success return path */
  self->iface = (struct NaClReverseInterface *) NaClRefCountRef(
      (struct NaClRefCount *) iface);
  self->thread_count = 0;

  retval = 1;
  goto done;

  /* cleanup unwind */
 condvar_ctor_fail:
  NaClMutexDtor(&self->mu);
 mutex_ctor_fail:
  (*NACL_VTBL(NaClRefCount, self)->Dtor)((struct NaClRefCount *) self);
 done:
  return retval;
}
Пример #7
0
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;
}
int NaClKernelServiceCtor(
    struct NaClKernelService        *self,
    NaClThreadIfFactoryFunction     thread_factory_fn,
    void                            *thread_factory_data,
    struct NaClRuntimeHostInterface *runtime_host) {
  NaClLog(4,
          ("NaClKernelServiceCtor: self 0x%"NACL_PRIxPTR","
           " runtime_host 0x%"NACL_PRIxPTR"\n"),
          (uintptr_t) self,
          (uintptr_t) runtime_host);
  if (!NaClSimpleServiceCtor(&self->base,
                             kNaClKernelServiceHandlers,
                             thread_factory_fn,
                             thread_factory_data)) {
    return 0;
  }
  self->runtime_host = (struct NaClRuntimeHostInterface *)
      NaClRefCountRef((struct NaClRefCount *) runtime_host);
  NACL_VTBL(NaClRefCount, self) =
      (struct NaClRefCountVtbl *) &kNaClKernelServiceVtbl;
  return 1;
}
Пример #9
0
struct NaClDesc *NaClDescRef(struct NaClDesc *ndp) {
  return (struct NaClDesc *) NaClRefCountRef(&ndp->base);
}