diff options
author | Thomas Haller <thaller@redhat.com> | 2019-08-08 08:38:12 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-08-08 15:01:21 (GMT) |
commit | f1a085994a78a69abcd583d682b9850bc20ed482 (patch) | |
tree | 591bfb5cc7efd959323241303f2eddcc61eb4d8a | |
parent | f6f163d68e756d7ee69b93b0ccb4ab24f9764f77 (diff) | |
download | libnl-f1a085994a78a69abcd583d682b9850bc20ed482.zip libnl-f1a085994a78a69abcd583d682b9850bc20ed482.tar.gz libnl-f1a085994a78a69abcd583d682b9850bc20ed482.tar.bz2 |
link/sriov: fix memleak in rtnl_link_sriov_clone()
Found by Coverity.
-rw-r--r-- | lib/route/link/sriov.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/route/link/sriov.c b/lib/route/link/sriov.c index 5c20ecf..2a87cfe 100644 --- a/lib/route/link/sriov.c +++ b/lib/route/link/sriov.c @@ -109,8 +109,10 @@ int rtnl_link_sriov_clone(struct rtnl_link *dst, struct rtnl_link *src) { if (s_vf->ce_mask & SRIOV_ATTR_ADDR) { vf_addr = nl_addr_clone(s_vf->vf_lladdr); - if (!vf_addr) + if (!vf_addr) { + rtnl_link_vf_put(d_vf); return -NLE_NOMEM; + } d_vf->vf_lladdr = vf_addr; } @@ -120,8 +122,10 @@ int rtnl_link_sriov_clone(struct rtnl_link *dst, struct rtnl_link *src) { err = rtnl_link_vf_vlan_alloc(&dst_vlans, src_vlans->size); - if (err < 0) + if (err < 0) { + rtnl_link_vf_put(d_vf); return err; + } dst_vlan_info = dst_vlans->vlans; memcpy(dst_vlans, src_vlans, sizeof(nl_vf_vlans_t)); memcpy(dst_vlan_info, src_vlan_info, @@ -558,8 +562,10 @@ int rtnl_link_sriov_parse_vflist(struct rtnl_link *link, struct nlattr **tb) { vf_data->vf_lladdr = nl_addr_build(AF_LLC, vf_lladdr->mac, 6); - if (vf_data->vf_lladdr == NULL) + if (vf_data->vf_lladdr == NULL) { + rtnl_link_vf_put(vf_data); return -NLE_NOMEM; + } nl_addr_set_family(vf_data->vf_lladdr, AF_LLC); vf_data->ce_mask |= SRIOV_ATTR_ADDR; } @@ -576,8 +582,10 @@ int rtnl_link_sriov_parse_vflist(struct rtnl_link *link, struct nlattr **tb) { err = rtnl_link_vf_vlan_info(list_len, vf_vlan_info, &vf_vlans); - if (err < 0) + if (err < 0) { + rtnl_link_vf_put(vf_data); return err; + } vf_data->vf_vlans = vf_vlans; vf_data->ce_mask |= SRIOV_ATTR_VLAN; @@ -586,8 +594,10 @@ int rtnl_link_sriov_parse_vflist(struct rtnl_link *link, struct nlattr **tb) { if (vf_vlan->vlan) { err = rtnl_link_vf_vlan_alloc(&vf_vlans, 1); - if (err < 0) + if (err < 0) { + rtnl_link_vf_put(vf_data); return err; + } vf_vlans->vlans[0].vf_vlan = vf_vlan->vlan; vf_vlans->vlans[0].vf_vlan_qos = vf_vlan->qos; @@ -649,8 +659,10 @@ int rtnl_link_sriov_parse_vflist(struct rtnl_link *link, struct nlattr **tb) { err = nla_parse_nested(stb, IFLA_VF_STATS_MAX, t[IFLA_VF_STATS], sriov_stats_policy); - if (err < 0) + if (err < 0) { + rtnl_link_vf_put(vf_data); return err; + } SET_VF_STAT(link, cur, stb, RTNL_LINK_VF_STATS_RX_PACKETS, |