From: Herbert Xu Date: Wed, 13 Jan 2016 06:59:03 +0000 (+0800) Subject: crypto: af_alg - Allow af_af_alg_release_parent to be called on nokey path X-Git-Tag: v4.1.12-92~150^2~283 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=67e42c97d43e17a633373ad0839320fd6841cd48;p=users%2Fjedix%2Flinux-maple.git crypto: af_alg - Allow af_af_alg_release_parent to be called on nokey path Orabug: stable_rc4 [ Upstream commit 6a935170a980024dd29199e9dbb5c4da4767a1b9 ] This patch allows af_alg_release_parent to be called even for nokey sockets. Cc: stable@vger.kernel.org Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin (cherry picked from commit 99214a2ff7f6faef389659e93dafdf41ae86a72b) Signed-off-by: Dan Duval --- diff --git a/crypto/af_alg.c b/crypto/af_alg.c index fef296cc91241..63acec501aaa0 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -133,6 +133,12 @@ void af_alg_release_parent(struct sock *sk) bool last; sk = ask->parent; + + if (ask->nokey_refcnt && !ask->refcnt) { + sock_put(sk); + return; + } + ask = alg_sk(sk); lock_sock(sk); @@ -265,8 +271,8 @@ int af_alg_accept(struct sock *sk, struct socket *newsock) struct alg_sock *ask = alg_sk(sk); const struct af_alg_type *type; struct sock *sk2; + unsigned int nokey; int err; - bool nokey; lock_sock(sk); type = ask->type; @@ -299,6 +305,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock) sock_hold(sk); alg_sk(sk2)->parent = sk; alg_sk(sk2)->type = type; + alg_sk(sk2)->nokey_refcnt = nokey; newsock->ops = type->ops; newsock->state = SS_CONNECTED; diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h index df8284415c565..a2bfd7843f18f 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h @@ -31,6 +31,7 @@ struct alg_sock { struct sock *parent; unsigned int refcnt; + unsigned int nokey_refcnt; const struct af_alg_type *type; void *private;