int NaClGioShmAllocCtor(struct NaClGioShm *self, size_t shm_size) { struct NaClDescImcShm *shmp; int rv; CHECK(shm_size == NaClRoundAllocPage(shm_size)); if (!NaClDescEffectorTrustedMemCtor(&self->eff)) { return 0; } shmp = malloc(sizeof *shmp); if (NULL == shmp) { (*self->eff.base.vtbl->Dtor)(&self->eff.base); return 0; } if (!NaClDescImcShmAllocCtor(shmp, shm_size, /* executable= */ 0)) { (*self->eff.base.vtbl->Dtor)(&self->eff.base); free(shmp); return 0; } rv = NaClGioShmCtorIntern(self, (struct NaClDesc *) shmp, shm_size); if (!rv) { NaClDescUnref((struct NaClDesc *) shmp); free(shmp); (*self->eff.base.vtbl->Dtor)(&self->eff.base); } return rv; }
int NaClGioShmCtor(struct NaClGioShm *self, struct NaClDesc *shmp, size_t shm_size) { int rv; CHECK(shm_size == NaClRoundAllocPage(shm_size)); rv = NaClGioShmCtorIntern(self, shmp, shm_size); return rv; }
int NaClGioShmCtor(struct NaClGioShm *self, struct NaClDesc *shmp, size_t shm_size) { int rv; CHECK(shm_size == NaClRoundAllocPage(shm_size)); if (!NaClDescEffectorTrustedMemCtor(&self->eff)) { return 0; } rv = NaClGioShmCtorIntern(self, shmp, shm_size); if (!rv) { (*self->eff.base.vtbl->Dtor)(&self->eff.base); } return rv; }
int NaClGioShmAllocCtor(struct NaClGioShm *self, size_t shm_size) { struct NaClDescImcShm *shmp; int rv; CHECK(shm_size == NaClRoundAllocPage(shm_size)); shmp = malloc(sizeof *shmp); if (NULL == shmp) { return 0; } if (!NaClDescImcShmAllocCtor(shmp, shm_size, /* executable= */ 0)) { free(shmp); return 0; } rv = NaClGioShmCtorIntern(self, (struct NaClDesc *) shmp, shm_size); NaClDescUnref((struct NaClDesc *) shmp); if (!rv) { free(shmp); } return rv; }