Skip to content

Commit

Permalink
crypto: af_alg - Forbid bind(2) when nokey child sockets are present
Browse files Browse the repository at this point in the history
This patch forbids the calling of bind(2) when there are child
sockets created by accept(2) in existence, even if they are created
on the nokey path.

This is needed as those child sockets have references to the tfm
object which bind(2) will destroy.

Cc: [email protected]
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jan 18, 2016
1 parent d7b65ae commit a6a48c5
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions crypto/af_alg.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,19 +130,16 @@ EXPORT_SYMBOL_GPL(af_alg_release);
void af_alg_release_parent(struct sock *sk)
{
struct alg_sock *ask = alg_sk(sk);
bool last;
unsigned int nokey = ask->nokey_refcnt;
bool last = nokey && !ask->refcnt;

sk = ask->parent;

if (ask->nokey_refcnt && !ask->refcnt) {
sock_put(sk);
return;
}

ask = alg_sk(sk);

lock_sock(sk);
last = !--ask->refcnt;
ask->nokey_refcnt -= nokey;
if (!last)
last = !--ask->refcnt;
release_sock(sk);

if (last)
Expand Down Expand Up @@ -188,7 +185,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)

err = -EBUSY;
lock_sock(sk);
if (ask->refcnt)
if (ask->refcnt | ask->nokey_refcnt)
goto unlock;

swap(ask->type, type);
Expand Down Expand Up @@ -306,6 +303,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock)

if (nokey || !ask->refcnt++)
sock_hold(sk);
ask->nokey_refcnt += nokey;
alg_sk(sk2)->parent = sk;
alg_sk(sk2)->type = type;
alg_sk(sk2)->nokey_refcnt = nokey;
Expand Down

0 comments on commit a6a48c5

Please sign in to comment.