提交 4ee45ea0 编写于 作者: L Li RongQing 提交者: David S. Miller

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: NLi RongQing <roy.qing.li@gmail.com>
Acked-by: NPravin B Shelar <pshelar@nicira.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 41ad82f7
...@@ -404,7 +404,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb, ...@@ -404,7 +404,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
{ {
struct ovs_header *upcall; struct ovs_header *upcall;
struct sk_buff *nskb = NULL; 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 nlattr *nla;
struct genl_info info = { struct genl_info info = {
.dst_sk = ovs_dp_get_net(dp)->genl_sock, .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, ...@@ -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; ((struct nlmsghdr *) user_skb->data)->nlmsg_len = user_skb->len;
err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid); err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid);
user_skb = NULL;
out: out:
if (err) if (err)
skb_tx_error(skb); skb_tx_error(skb);
kfree_skb(user_skb);
kfree_skb(nskb); kfree_skb(nskb);
return err; return err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册