diff options
Diffstat (limited to 'net/sunrpc/auth_generic.c')
| -rw-r--r-- | net/sunrpc/auth_generic.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 744b79fdcb1..4028502f052 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c @@ -133,13 +133,29 @@ static int  generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags)  {  	struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); +	int i;  	if (gcred->acred.uid != acred->uid ||  	    gcred->acred.gid != acred->gid || -	    gcred->acred.group_info != acred->group_info ||  	    gcred->acred.machine_cred != acred->machine_cred) -		return 0; +		goto out_nomatch; + +	/* Optimisation in the case where pointers are identical... */ +	if (gcred->acred.group_info == acred->group_info) +		goto out_match; + +	/* Slow path... */ +	if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) +		goto out_nomatch; +	for (i = 0; i < gcred->acred.group_info->ngroups; i++) { +		if (GROUP_AT(gcred->acred.group_info, i) != +				GROUP_AT(acred->group_info, i)) +			goto out_nomatch; +	} +out_match:  	return 1; +out_nomatch: +	return 0;  }  void __init rpc_init_generic_auth(void)  |