static struct aa_namespace *alloc_namespace(const char *prefix, const char *name) { struct aa_namespace *ns; ns = kzalloc(sizeof(*ns), GFP_KERNEL); AA_DEBUG("%s(%p)\n", __func__, ns); if (!ns) return NULL; if (!policy_init(&ns->base, prefix, name)) goto fail_ns; INIT_LIST_HEAD(&ns->sub_ns); rwlock_init(&ns->lock); ns->unconfined = aa_alloc_profile("unconfined"); if (!ns->unconfined) goto fail_unconfined; ns->unconfined->sid = aa_alloc_sid(); ns->unconfined->flags = PFLAG_UNCONFINED | PFLAG_IX_ON_NAME_ERROR | PFLAG_IMMUTABLE; ns->unconfined->ns = aa_get_namespace(ns); return ns; fail_unconfined: kzfree(ns->base.hname); fail_ns: kzfree(ns); return NULL; }
/** * alloc_namespace - allocate, initialize and return a new namespace * @prefix: parent namespace name (MAYBE NULL) * @name: a preallocated name (NOT NULL) * * Returns: refcounted namespace or NULL on failure. */ static struct aa_namespace *alloc_namespace(const char *prefix, const char *name) { struct aa_namespace *ns; ns = kzalloc(sizeof(*ns), GFP_KERNEL); AA_DEBUG("%s(%p)\n", __func__, ns); if (!ns) return NULL; if (!policy_init(&ns->base, prefix, name)) goto fail_ns; INIT_LIST_HEAD(&ns->sub_ns); rwlock_init(&ns->lock); /* released by free_namespace */ ns->unconfined = aa_alloc_profile("unconfined"); if (!ns->unconfined) goto fail_unconfined; ns->unconfined->flags = PFLAG_UNCONFINED | PFLAG_IX_ON_NAME_ERROR | PFLAG_IMMUTABLE; /* * released by free_namespace, however __remove_namespace breaks * the cyclic references (ns->unconfined, and unconfined->ns) and * replaces with refs to parent namespace unconfined */ ns->unconfined->ns = aa_get_namespace(ns); atomic_set(&ns->uniq_null, 0); return ns; fail_unconfined: kzfree(ns->base.hname); fail_ns: kzfree(ns); return NULL; }