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: 03414a49ad ("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…
	
		Reference in New Issue
	
	Block a user