mirror of https://gitee.com/openkylin/linux.git
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
|
@ -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,
|
||||||
((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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue