diff mbox series

selinux: fix NULL-pointer dereference when hashtab allocation fails

Message ID 20211119134520.943504-1-omosnace@redhat.com (mailing list archive)
State Accepted
Delegated to: Paul Moore
Headers show
Series selinux: fix NULL-pointer dereference when hashtab allocation fails | expand

Commit Message

Ondrej Mosnacek Nov. 19, 2021, 1:45 p.m. UTC
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.

Fixes: 03414a49ad5f ("selinux: do not allocate hashtabs dynamically")
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
---
 security/selinux/ss/hashtab.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Paul Moore Nov. 19, 2021, 9:24 p.m. UTC | #1
On Fri, Nov 19, 2021 at 8:45 AM Ondrej Mosnacek <omosnace@redhat.com> wrote:
>
> 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.
>
> Fixes: 03414a49ad5f ("selinux: do not allocate hashtabs dynamically")
> Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
> ---
>  security/selinux/ss/hashtab.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)

Looks good to me, merged into selinux/stable-5.16.  However, as it is
Friday, I'm going to hold of on sending this to Linus until early next
week.
diff mbox series

Patch

diff --git a/security/selinux/ss/hashtab.c b/security/selinux/ss/hashtab.c
index 727c3b484bd3..0ae4e4e57a40 100644
--- a/security/selinux/ss/hashtab.c
+++ b/security/selinux/ss/hashtab.c
@@ -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,