openvswitch: fix a memory leak
The user_skb maybe be leaked if the operation on it failed and codes skipped into the label "out:" without calling genlmsg_unicast. Cc: Pravin Shelar <pshelar@nicira.com> Signed-off-by: Li RongQing <roy.qing.li@gmail.com> Acked-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
41ad82f7f8
commit
4ee45ea05c
1 changed files with 3 additions and 1 deletions
|
@ -404,7 +404,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
|||
{
|
||||
struct ovs_header *upcall;
|
||||
struct sk_buff *nskb = NULL;
|
||||
struct sk_buff *user_skb; /* to be queued to userspace */
|
||||
struct sk_buff *user_skb = NULL; /* to be queued to userspace */
|
||||
struct nlattr *nla;
|
||||
struct genl_info info = {
|
||||
.dst_sk = ovs_dp_get_net(dp)->genl_sock,
|
||||
|
@ -494,9 +494,11 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
|||
((struct nlmsghdr *) user_skb->data)->nlmsg_len = user_skb->len;
|
||||
|
||||
err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid);
|
||||
user_skb = NULL;
|
||||
out:
|
||||
if (err)
|
||||
skb_tx_error(skb);
|
||||
kfree_skb(user_skb);
|
||||
kfree_skb(nskb);
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue