예제 #1
0
int NaClDescConnCapFdInternalize(
    struct NaClDesc               **out_desc,
    struct NaClDescXferState      *xfer) {
  struct NaClDescConnCapFd *conn_cap;
  int rv;

  conn_cap = malloc(sizeof(*conn_cap));
  if (NULL == conn_cap) {
    return -NACL_ABI_ENOMEM;
  }
  if (!NaClDescInternalizeCtor(&conn_cap->base, xfer)) {
    free(conn_cap);
    conn_cap = NULL;
    rv = -NACL_ABI_ENOMEM;
    goto cleanup;
  }
  if (xfer->next_handle == xfer->handle_buffer_end) {
    rv = -NACL_ABI_EIO;
    goto cleanup;
  }
  rv = NaClDescConnCapFdSubclassCtor(conn_cap, *xfer->next_handle);
  if (!rv) {
    rv = -NACL_ABI_ENOMEM;
    goto cleanup;
  }
  *xfer->next_handle++ = NACL_INVALID_HANDLE;
  *out_desc = &conn_cap->base;
  rv = 0;
 cleanup:
  if (rv < 0) {
    NaClDescSafeUnref((struct NaClDesc *) conn_cap);
  }
  return rv;
}
예제 #2
0
int NaClDescConnCapFdCtor(struct NaClDescConnCapFd  *self,
                          NaClHandle                endpt) {
    struct NaClDesc *basep = (struct NaClDesc *) self;
    int rv;

    basep->base.vtbl = (struct NaClRefCountVtbl const *) NULL;
    if (!NaClDescCtor(basep)) {
        return 0;
    }
    rv = NaClDescConnCapFdSubclassCtor(self, endpt);
    if (!rv) {
        (*NACL_VTBL(NaClRefCount, basep)->Dtor)((struct NaClRefCount *) self);
    }
    return rv;
}