struct sysret sys_monitor_nullify_cap(capaddr_t cptr, uint8_t bits) { struct capability *root = &dcb_current->cspace.cap; struct cte *cte; errval_t err = caps_lookup_slot(root, cptr, bits, &cte, CAPRIGHTS_READ_WRITE); if (err_is_fail(err)) { return SYSRET(err); } // remove from MDB remove_mapping(cte); // zero-out cap entry assert(!mdb_reachable(cte)); memset(cte, 0, sizeof(*cte)); return SYSRET(SYS_ERR_OK); }
/** * \brief Cleanup a cap copy but not the object represented by the cap */ static errval_t cleanup_copy(struct cte *cte) { errval_t err; TRACE_CAP_MSG("cleaning up copy", cte); struct capability *cap = &cte->cap; if (type_is_vnode(cap->type) || cap->type == ObjType_Frame || cap->type == ObjType_DevFrame) { unmap_capability(cte); } if (distcap_is_foreign(cte)) { TRACE_CAP_MSG("cleaning up non-owned copy", cte); if (cte->mdbnode.remote_copies || cte->mdbnode.remote_descs) { struct cte *ancestor = mdb_find_ancestor(cte); if (ancestor) { mdb_set_relations(ancestor, RRELS_DESC_BIT, RRELS_DESC_BIT); } } } err = mdb_remove(cte); if (err_is_fail(err)) { return err; } TRACE_CAP_MSG("cleaned up copy", cte); assert(!mdb_reachable(cte)); memset(cte, 0, sizeof(*cte)); return SYS_ERR_OK; }