summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-08-08 10:38:12 +0200
committerThomas Haller <thaller@redhat.com>2019-08-08 17:01:21 +0200
commitf1a085994a78a69abcd583d682b9850bc20ed482 (patch)
tree591bfb5cc7efd959323241303f2eddcc61eb4d8a /lib
parentf6f163d68e756d7ee69b93b0ccb4ab24f9764f77 (diff)
downloadlibnl-f1a085994a78a69abcd583d682b9850bc20ed482.tar.gz
link/sriov: fix memleak in rtnl_link_sriov_clone()
Found by Coverity.
Diffstat (limited to 'lib')
-rw-r--r--lib/route/link/sriov.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/route/link/sriov.c b/lib/route/link/sriov.c
index 5c20ecff..2a87cfe5 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,