Skip to content

Commit

Permalink
selinux: fix NULL-pointer dereference when hashtab allocation fails
Browse files Browse the repository at this point in the history
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: [email protected]
Fixes: 03414a4 ("selinux: do not allocate hashtabs dynamically")
Signed-off-by: Ondrej Mosnacek <[email protected]>
Signed-off-by: Paul Moore <[email protected]>
  • Loading branch information
WOnder93 authored and pcmoore committed Nov 19, 2021
1 parent 32a370a commit dc27f3c
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions security/selinux/ss/hashtab.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
u32 size = hashtab_compute_size(nel_hint);

/* should already be zeroed, but better be safe */
h->nel = 0;
if (!h->size)
return 0;
h->size = 0;
h->htable = NULL;

h->htable = kcalloc(h->size, sizeof(*h->htable), GFP_KERNEL);
return h->htable ? 0 : -ENOMEM;
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,
Expand Down

0 comments on commit dc27f3c

Please sign in to comment.