diff options
Diffstat (limited to 'crypto/af_alg.c')
| -rw-r--r-- | crypto/af_alg.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index f22cc56fd1b3..a8e7aa3e257b 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -127,6 +127,7 @@ EXPORT_SYMBOL_GPL(af_alg_release);  static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  { +	const u32 forbidden = CRYPTO_ALG_INTERNAL;  	struct sock *sk = sock->sk;  	struct alg_sock *ask = alg_sk(sk);  	struct sockaddr_alg *sa = (void *)uaddr; @@ -151,7 +152,9 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  	if (IS_ERR(type))  		return PTR_ERR(type); -	private = type->bind(sa->salg_name, sa->salg_feat, sa->salg_mask); +	private = type->bind(sa->salg_name, +			     sa->salg_feat & ~forbidden, +			     sa->salg_mask & ~forbidden);  	if (IS_ERR(private)) {  		module_put(type->owner);  		return PTR_ERR(private); @@ -244,7 +247,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock)  	if (!type)  		goto unlock; -	sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto); +	sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto, 0);  	err = -ENOMEM;  	if (!sk2)  		goto unlock; @@ -324,7 +327,7 @@ static int alg_create(struct net *net, struct socket *sock, int protocol,  		return -EPROTONOSUPPORT;  	err = -ENOMEM; -	sk = sk_alloc(net, PF_ALG, GFP_KERNEL, &alg_proto); +	sk = sk_alloc(net, PF_ALG, GFP_KERNEL, &alg_proto, kern);  	if (!sk)  		goto out;  |