diff options
Diffstat (limited to 'kernel/cred.c')
| -rw-r--r-- | kernel/cred.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/kernel/cred.c b/kernel/cred.c index 6a1aa004e37..3a9d6dd53a6 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -252,13 +252,13 @@ struct cred *cred_alloc_blank(void)  #endif  	atomic_set(&new->usage, 1); +#ifdef CONFIG_DEBUG_CREDENTIALS +	new->magic = CRED_MAGIC; +#endif  	if (security_cred_alloc_blank(new, GFP_KERNEL) < 0)  		goto error; -#ifdef CONFIG_DEBUG_CREDENTIALS -	new->magic = CRED_MAGIC; -#endif  	return new;  error: @@ -657,6 +657,8 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)  	validate_creds(old);  	*new = *old; +	atomic_set(&new->usage, 1); +	set_cred_subscribers(new, 0);  	get_uid(new->user);  	get_group_info(new->group_info); @@ -674,8 +676,6 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)  	if (security_prepare_creds(new, old, GFP_KERNEL) < 0)  		goto error; -	atomic_set(&new->usage, 1); -	set_cred_subscribers(new, 0);  	put_cred(old);  	validate_creds(new);  	return new; @@ -748,7 +748,11 @@ bool creds_are_invalid(const struct cred *cred)  	if (cred->magic != CRED_MAGIC)  		return true;  #ifdef CONFIG_SECURITY_SELINUX -	if (selinux_is_enabled()) { +	/* +	 * cred->security == NULL if security_cred_alloc_blank() or +	 * security_prepare_creds() returned an error. +	 */ +	if (selinux_is_enabled() && cred->security) {  		if ((unsigned long) cred->security < PAGE_SIZE)  			return true;  		if ((*(u32 *)cred->security & 0xffffff00) ==  |