mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 18:26:42 +00:00
selinux: fix NULL-pointer dereference when hashtab allocation fails
When the hash table slot array allocation fails in hashtab_init(), h->size is left initialized with a non-zero value, but the h->htable pointer is NULL. This may then cause a NULL pointer dereference, since the policydb code relies on the assumption that even after a failed hashtab_init(), hashtab_map() and hashtab_destroy() can be safely called on it. Yet, these detect an empty hashtab only by looking at the size. Fix this by making sure that hashtab_init() always leaves behind a valid empty hashtab when the allocation fails. Cc: stable@vger.kernel.org Fixes: 03414a49ad5f ("selinux: do not allocate hashtabs dynamically") Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
parent
32a370abf1
commit
dc27f3c5d1
@ -31,13 +31,20 @@ static u32 hashtab_compute_size(u32 nel)
|
||||
|
||||
int hashtab_init(struct hashtab *h, u32 nel_hint)
|
||||
{
|
||||
h->size = hashtab_compute_size(nel_hint);
|
||||
h->nel = 0;
|
||||
if (!h->size)
|
||||
return 0;
|
||||
u32 size = hashtab_compute_size(nel_hint);
|
||||
|
||||
h->htable = kcalloc(h->size, sizeof(*h->htable), GFP_KERNEL);
|
||||
return h->htable ? 0 : -ENOMEM;
|
||||
/* should already be zeroed, but better be safe */
|
||||
h->nel = 0;
|
||||
h->size = 0;
|
||||
h->htable = NULL;
|
||||
|
||||
if (size) {
|
||||
h->htable = kcalloc(size, sizeof(*h->htable), GFP_KERNEL);
|
||||
if (!h->htable)
|
||||
return -ENOMEM;
|
||||
h->size = size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __hashtab_insert(struct hashtab *h, struct hashtab_node **dst,
|
||||
|
Loading…
x
Reference in New Issue
Block a user