diff options
Diffstat (limited to 'kernel/cred.c')
| -rw-r--r-- | kernel/cred.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/kernel/cred.c b/kernel/cred.c index 1ed8ca18790..62af1816c23 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -10,6 +10,7 @@   */  #include <linux/module.h>  #include <linux/cred.h> +#include <linux/slab.h>  #include <linux/sched.h>  #include <linux/key.h>  #include <linux/keyctl.h> @@ -364,7 +365,7 @@ struct cred *prepare_usermodehelper_creds(void)  	new = kmem_cache_alloc(cred_jar, GFP_ATOMIC);  	if (!new) -		return NULL; +		goto free_tgcred;  	kdebug("prepare_usermodehelper_creds() alloc %p", new); @@ -398,6 +399,12 @@ struct cred *prepare_usermodehelper_creds(void)  error:  	put_cred(new);  	return NULL; + +free_tgcred: +#ifdef CONFIG_KEYS +	kfree(tgcred); +#endif +	return NULL;  }  /* @@ -786,8 +793,6 @@ bool creds_are_invalid(const struct cred *cred)  {  	if (cred->magic != CRED_MAGIC)  		return true; -	if (atomic_read(&cred->usage) < atomic_read(&cred->subscribers)) -		return true;  #ifdef CONFIG_SECURITY_SELINUX  	if (selinux_is_enabled()) {  		if ((unsigned long) cred->security < PAGE_SIZE)  |