int NaClDescXferableDataDescInternalize(struct NaClDesc **baseptr, struct NaClDescXferState *xfer) { int rv; NaClHandle h; struct NaClDescXferableDataDesc *ndxdp; NaClLog(4, "Entered NaClDescXferableDataDescInternalize\n"); rv = -NACL_ABI_EIO; h = NACL_INVALID_HANDLE; ndxdp = NULL; if (xfer->next_handle == xfer->handle_buffer_end) { NaClLog(LOG_ERROR, ("NaClXferableDataDescInternalize: no descriptor" " left in xfer state\n")); rv = -NACL_ABI_EIO; goto cleanup; } ndxdp = malloc(sizeof *ndxdp); if (NULL == ndxdp) { NaClLog(LOG_ERROR, "NaClXferableDataDescInternalize: no memory\n"); rv = -NACL_ABI_ENOMEM; goto cleanup; } if (!NaClDescXferableDataDescCtor(ndxdp, *xfer->next_handle)) { NaClLog(LOG_ERROR, "NaClXferableDataDescInternalize: descriptor ctor error\n"); rv = -NACL_ABI_EIO; goto cleanup; } *xfer->next_handle++ = NACL_INVALID_HANDLE; *baseptr = (struct NaClDesc *) ndxdp; rv = 0; cleanup: if (rv < 0) { free(ndxdp); } return rv; }
int32_t NaClCommonDescSocketPair(struct NaClDesc *pair[2]) { int32_t retval = -NACL_ABI_EIO; struct NaClDescXferableDataDesc *d0; struct NaClDescXferableDataDesc *d1; NaClHandle sock_pair[2]; /* * mark resources to enable easy cleanup */ d0 = NULL; d1 = NULL; sock_pair[0] = NACL_INVALID_HANDLE; sock_pair[1] = NACL_INVALID_HANDLE; if (0 != NaClSocketPair(sock_pair)) { NaClLog(1, "NaClCommonSysImc_Socket_Pair: IMC socket pair creation failed\n"); retval = -NACL_ABI_ENFILE; goto cleanup; } if (NULL == (d0 = malloc(sizeof *d0))) { retval = -NACL_ABI_ENOMEM; goto cleanup; } if (NULL == (d1 = malloc(sizeof *d1))) { free((void *) d0); d0 = NULL; retval = -NACL_ABI_ENOMEM; goto cleanup; } if (!NaClDescXferableDataDescCtor(d0, sock_pair[0])) { free((void *) d0); d0 = NULL; free((void *) d1); d1 = NULL; retval = -NACL_ABI_ENFILE; goto cleanup; } sock_pair[0] = NACL_INVALID_HANDLE; /* ctor took ownership */ if (!NaClDescXferableDataDescCtor(d1, sock_pair[1])) { free((void *) d1); d1 = NULL; retval = -NACL_ABI_ENFILE; goto cleanup; } sock_pair[1] = NACL_INVALID_HANDLE; /* ctor took ownership */ pair[0] = (struct NaClDesc *) d0; d0 = NULL; pair[1] = (struct NaClDesc *) d1; d1 = NULL; retval = 0; cleanup: /* * pre: d0 and d1 must either be NULL or point to fully constructed * NaClDesc objects */ if (NULL != d0) { NaClDescUnref((struct NaClDesc *) d0); } if (NULL != d1) { NaClDescUnref((struct NaClDesc *) d1); } if (NACL_INVALID_HANDLE != sock_pair[0]) { (void) NaClClose(sock_pair[0]); } if (NACL_INVALID_HANDLE != sock_pair[1]) { (void) NaClClose(sock_pair[1]); } free(d0); free(d1); return retval; }