af_key: Free dumping state on socket close
Fix a xfrm_{state,policy}_walk leak if pfkey socket is closed while dumping is on-going. Signed-off-by: Timo Teras <timo.teras@iki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
5dc121e9a7
Коммит
0523820482
|
@ -73,22 +73,18 @@ static int pfkey_can_dump(struct sock *sk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pfkey_do_dump(struct pfkey_sock *pfk)
|
||||
static void pfkey_terminate_dump(struct pfkey_sock *pfk)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = pfk->dump.dump(pfk);
|
||||
if (rc == -ENOBUFS)
|
||||
return 0;
|
||||
|
||||
pfk->dump.done(pfk);
|
||||
pfk->dump.dump = NULL;
|
||||
pfk->dump.done = NULL;
|
||||
return rc;
|
||||
if (pfk->dump.dump) {
|
||||
pfk->dump.done(pfk);
|
||||
pfk->dump.dump = NULL;
|
||||
pfk->dump.done = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void pfkey_sock_destruct(struct sock *sk)
|
||||
{
|
||||
pfkey_terminate_dump(pfkey_sk(sk));
|
||||
skb_queue_purge(&sk->sk_receive_queue);
|
||||
|
||||
if (!sock_flag(sk, SOCK_DEAD)) {
|
||||
|
@ -310,6 +306,18 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,
|
|||
return err;
|
||||
}
|
||||
|
||||
static int pfkey_do_dump(struct pfkey_sock *pfk)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = pfk->dump.dump(pfk);
|
||||
if (rc == -ENOBUFS)
|
||||
return 0;
|
||||
|
||||
pfkey_terminate_dump(pfk);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline void pfkey_hdr_dup(struct sadb_msg *new, struct sadb_msg *orig)
|
||||
{
|
||||
*new = *orig;
|
||||
|
|
Загрузка…
Ссылка в новой задаче