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; }
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; }