struct NaClDesc *NaClDescImcShmMake(NaClHandle handle, nacl_off64_t size) { struct NaClDescImcShm *desc = malloc(sizeof(*desc)); if (NULL == desc) { return NULL; } if (!NaClDescImcShmCtor(desc, handle, size)) { free(desc); return NULL; } return &desc->base; }
int NaClDescImcShmInternalize(struct NaClDesc **out_desc, struct NaClDescXferState *xfer) { int rv; struct NaClDescImcShm *ndisp; NaClHandle h; nacl_off64_t hsize; rv = -NACL_ABI_EIO; ndisp = NULL; if (xfer->next_handle == xfer->handle_buffer_end) { rv = -NACL_ABI_EIO; goto cleanup; } if (xfer->next_byte + sizeof ndisp->size > xfer->byte_buffer_end) { rv = -NACL_ABI_EIO; goto cleanup; } ndisp = malloc(sizeof *ndisp); if (NULL == ndisp) { rv = -NACL_ABI_ENOMEM; goto cleanup; } h = *xfer->next_handle; *xfer->next_handle++ = NACL_INVALID_HANDLE; memcpy(&hsize, xfer->next_byte, sizeof hsize); xfer->next_byte += sizeof hsize; if (0 == NaClDescImcShmCtor(ndisp, h, hsize)) { rv = -NACL_ABI_EIO; goto cleanup; } *out_desc = (struct NaClDesc *) ndisp; rv = 0; cleanup: if (rv < 0) { free(ndisp); } return rv; }
int NaClDescImcShmAllocCtor(struct NaClDescImcShm *self, nacl_off64_t size, int executable) { NaClHandle h; int rv; if (size < 0 || SIZE_T_MAX < (uint64_t) size) { NaClLog(4, "NaClDescImcShmAllocCtor: requested size 0x%08"NACL_PRIx64 " (0x%08"NACL_PRId64") too large\n", size, size); return 0; } h = NaClCreateMemoryObject((size_t) size, executable); if (NACL_INVALID_HANDLE == h) { return 0; } if (0 == (rv = NaClDescImcShmCtor(self, h, size))) { (void) NaClClose(h); } return rv; }