diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2016-01-13 09:59:03 +0300 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2016-02-13 13:34:12 +0300 |
commit | 175577bbf41a69bd02b08a30e785ab3ba2a9c2fb (patch) | |
tree | 39f99914bacf75feb8775ab9041721e419fb7546 | |
parent | a59afee0ac4a3e6a249ebcb43da65ad99c513e33 (diff) | |
download | linux-175577bbf41a69bd02b08a30e785ab3ba2a9c2fb.tar.xz |
crypto: af_alg - Allow af_af_alg_release_parent to be called on nokey path
commit 6a935170a980024dd29199e9dbb5c4da4767a1b9 upstream.
This patch allows af_alg_release_parent to be called even for
nokey sockets.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r-- | crypto/af_alg.c | 9 | ||||
-rw-r--r-- | include/crypto/if_alg.h | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index de130c24a64b..2f8fd8441f34 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); @@ -258,8 +264,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; @@ -292,6 +298,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 9e6a2f38c52f..bfefd8139e18 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; |