diff options
author | Patrick McHardy <kaber@trash.net> | 2008-01-20 17:24:29 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-20 20:31:45 -0800 |
commit | d4782c323d10d3698b71b6a6b3c7bdad33824658 (patch) | |
tree | 5c2b4706135ab68f5690adbbe7480b627476608d /net/key | |
parent | 421c991483a6e52091cd2120c007cbc220d669ae (diff) | |
download | linux-d4782c323d10d3698b71b6a6b3c7bdad33824658.tar.gz linux-d4782c323d10d3698b71b6a6b3c7bdad33824658.tar.bz2 linux-d4782c323d10d3698b71b6a6b3c7bdad33824658.zip |
[AF_KEY]: Fix skb leak on pfkey_send_migrate() error
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/key')
-rw-r--r-- | net/key/af_key.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c index 26d5e63c4cc5..76dcd882f87b 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c @@ -3593,27 +3593,29 @@ static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type, /* old ipsecrequest */ int mode = pfkey_mode_from_xfrm(mp->mode); if (mode < 0) - return -EINVAL; + goto err; if (set_ipsecrequest(skb, mp->proto, mode, (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), mp->reqid, mp->old_family, - &mp->old_saddr, &mp->old_daddr) < 0) { - return -EINVAL; - } + &mp->old_saddr, &mp->old_daddr) < 0) + goto err; /* new ipsecrequest */ if (set_ipsecrequest(skb, mp->proto, mode, (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), mp->reqid, mp->new_family, - &mp->new_saddr, &mp->new_daddr) < 0) { - return -EINVAL; - } + &mp->new_saddr, &mp->new_daddr) < 0) + goto err; } /* broadcast migrate message to sockets */ pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL); return 0; + +err: + kfree_skb(skb); + return -EINVAL; } #else static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type, |