[dpdk-dev,v3,1/3] net/i40e: add null point check and fix mem leak

Message ID 1516675500-10878-1-git-send-email-wang.yong19@zte.com.cn (mailing list archive)
State Superseded, archived
Delegated to: Helin Zhang
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Yong Wang Jan. 23, 2018, 2:44 a.m. UTC
  Signed-off-by: Yong Wang <wang.yong19@zte.com.cn>
---
v2:
* Fix code style warning.
---
 drivers/net/i40e/i40e_ethdev.c | 32 ++++++++++++++++++++++++++++++++
 drivers/net/i40e/i40e_fdir.c   |  7 +++++++
 2 files changed, 39 insertions(+)
  

Comments

Zhang, Helin Jan. 24, 2018, 8:41 a.m. UTC | #1
Hi Yong

Thank you so much for your contribution! I have comments in general.
1. for a patch set, you need a cover letter for the series.
2. If a patch is to fix a bug/issue, the title should start with 'fix'.
3. A 'Fixes:' line is needed for any bug fixes.
4. A 'Cc:' line is needed, if the patch should be back ported into any stable release version.
5. you can find some good examples from the 'git log'.

Thanks!

Regards,
Helin
  
Yong Wang Jan. 24, 2018, 9:28 a.m. UTC | #2
SGkgSGVsaW4KVGhhbmtzIGZvciB5b3VyIGFkdmljZS4KSG93ZXZlciwgaXQncyBoYXJkIHRvIGZp
bmQgdGhlIG9yaWdpbmFsIHBhdGNoZXMgd2hpY2ggaW50cm9kdWNlZCB0aGUgYnVnIGluIGdlbmVy
YWwsIGVzcGVjYWlsbHkgd2hlbiB0aGUgZmlsZSBuYW1lIGhhcyBjaGFuZ2VkLgpUaGlzIG1heSBw
cmV2ZW50IHVzIHRvIGNvbnRyaWJ1dGUgdG8gZHBkay4KPCA0LiBBICdDYzonIGxpbmUgaXMgbmVl
ZGVkLCBpZiB0aGUgcGF0Y2ggc2hvdWxkIGJlIGJhY2sgcG9ydGVkIGludG8gYW55IHN0YWJsZSBy
ZWxlYXNlIHZlcnNpb24uCkFzIGEgY29tbW9uIGNvbnRyaWJ1dG9yLCBJIGRvbid0IGtub3cgd2hl
dGhlciB0aGUgcGF0Y2ggc2hvdWxkIGJlIGJhY2sgcG9ydGVkIGludG8gYW55IHN0YWJsZSByZWxl
YXNlIHZlcnNpb24uCkFuZCBJIGhhdmUgbm8gcmlnaHRzIHRvIG1ha2UgdGhpcyBkZWNpc2lvbi4K
ClRoYW5rIHlvdSEKCllvdXJzLApZb25nCgotLS0tLS0tLS0tLS0tLS0tLS1vcmlnaW4tLS0tLS0t
LS0tLS0tLS0tLS0KRnJvbe+8miA8aGVsaW4uemhhbmdAaW50ZWwuY29tPjsKVG/vvJo8d2FuZy55
b25nMTlAenRlLmNvbS5jbj47IDxiZWlsZWkueGluZ0BpbnRlbC5jb20+OyA8d2Vuemh1by5sdUBp
bnRlbC5jb20+OyA8ZmlvbmEudHJhaGVAaW50ZWwuY29tPjsKQ2PvvJogPGRldkBkcGRrLm9yZz47
CkRhdGUg77yaMjAxOC0wMS0yNCAxNjo0MQpTdWJqZWN0IO+8mlJFOiBbZHBkay1kZXZdIFtQQVRD
SCB2MyAxLzNdIG5ldC9pNDBlOiBhZGQgbnVsbCBwb2ludCBjaGVjayBhbmRmaXgJbWVtIGxlYWsK
SGkgWW9uZwoKVGhhbmsgeW91IHNvIG11Y2ggZm9yIHlvdXIgY29udHJpYnV0aW9uISBJIGhhdmUg
Y29tbWVudHMgaW4gZ2VuZXJhbC4KMS4gZm9yIGEgcGF0Y2ggc2V0LCB5b3UgbmVlZCBhIGNvdmVy
IGxldHRlciBmb3IgdGhlIHNlcmllcy4KMi4gSWYgYSBwYXRjaCBpcyB0byBmaXggYSBidWcvaXNz
dWUsIHRoZSB0aXRsZSBzaG91bGQgc3RhcnQgd2l0aCAnZml4Jy4KMy4gQSAnRml4ZXM6JyBsaW5l
IGlzIG5lZWRlZCBmb3IgYW55IGJ1ZyBmaXhlcy4KNC4gQSAnQ2M6JyBsaW5lIGlzIG5lZWRlZCwg
aWYgdGhlIHBhdGNoIHNob3VsZCBiZSBiYWNrIHBvcnRlZCBpbnRvIGFueSBzdGFibGUgcmVsZWFz
ZSB2ZXJzaW9uLgo1LiB5b3UgY2FuIGZpbmQgc29tZSBnb29kIGV4YW1wbGVzIGZyb20gdGhlICdn
aXQgbG9nJy4KClRoYW5rcyEKClJlZ2FyZHMsCkhlbGlu
  

Patch

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c4df65d..277c1a8 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -7188,11 +7188,13 @@  struct i40e_tunnel_filter *
 	node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
 	if (add && node) {
 		PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
+		rte_free(cld_filter);
 		return -EINVAL;
 	}
 
 	if (!add && !node) {
 		PMD_DRV_LOG(ERR, "There's no corresponding tunnel filter!");
+		rte_free(cld_filter);
 		return -EINVAL;
 	}
 
@@ -7201,16 +7203,26 @@  struct i40e_tunnel_filter *
 					vsi->seid, &cld_filter->element, 1);
 		if (ret < 0) {
 			PMD_DRV_LOG(ERR, "Failed to add a tunnel filter.");
+			rte_free(cld_filter);
 			return -ENOTSUP;
 		}
 		tunnel = rte_zmalloc("tunnel_filter", sizeof(*tunnel), 0);
+		if (tunnel == NULL) {
+			PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+			rte_free(cld_filter);
+			return -ENOMEM;
+		}
+
 		rte_memcpy(tunnel, &check_filter, sizeof(check_filter));
 		ret = i40e_sw_tunnel_filter_insert(pf, tunnel);
+		if (ret < 0)
+			rte_free(tunnel);
 	} else {
 		ret = i40e_aq_remove_cloud_filters(hw, vsi->seid,
 						   &cld_filter->element, 1);
 		if (ret < 0) {
 			PMD_DRV_LOG(ERR, "Failed to delete a tunnel filter.");
+			rte_free(cld_filter);
 			return -ENOTSUP;
 		}
 		ret = i40e_sw_tunnel_filter_del(pf, &node->input);
@@ -7639,6 +7651,7 @@  i40e_status_code i40e_replace_gtp_cloud_filter(struct i40e_pf *pf)
 	else {
 		if (tunnel_filter->vf_id >= pf->vf_num) {
 			PMD_DRV_LOG(ERR, "Invalid argument.");
+			rte_free(cld_filter);
 			return -EINVAL;
 		}
 		vf = &pf->vfs[tunnel_filter->vf_id];
@@ -7653,11 +7666,13 @@  i40e_status_code i40e_replace_gtp_cloud_filter(struct i40e_pf *pf)
 	node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
 	if (add && node) {
 		PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
+		rte_free(cld_filter);
 		return -EINVAL;
 	}
 
 	if (!add && !node) {
 		PMD_DRV_LOG(ERR, "There's no corresponding tunnel filter!");
+		rte_free(cld_filter);
 		return -EINVAL;
 	}
 
@@ -7670,11 +7685,20 @@  i40e_status_code i40e_replace_gtp_cloud_filter(struct i40e_pf *pf)
 					vsi->seid, &cld_filter->element, 1);
 		if (ret < 0) {
 			PMD_DRV_LOG(ERR, "Failed to add a tunnel filter.");
+			rte_free(cld_filter);
 			return -ENOTSUP;
 		}
 		tunnel = rte_zmalloc("tunnel_filter", sizeof(*tunnel), 0);
+		if (tunnel == NULL) {
+			PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+			rte_free(cld_filter);
+			return -ENOMEM;
+		}
+
 		rte_memcpy(tunnel, &check_filter, sizeof(check_filter));
 		ret = i40e_sw_tunnel_filter_insert(pf, tunnel);
+		if (ret < 0)
+			rte_free(tunnel);
 	} else {
 		if (big_buffer)
 			ret = i40e_aq_remove_cloud_filters_big_buffer(
@@ -7684,6 +7708,7 @@  i40e_status_code i40e_replace_gtp_cloud_filter(struct i40e_pf *pf)
 						   &cld_filter->element, 1);
 		if (ret < 0) {
 			PMD_DRV_LOG(ERR, "Failed to delete a tunnel filter.");
+			rte_free(cld_filter);
 			return -ENOTSUP;
 		}
 		ret = i40e_sw_tunnel_filter_del(pf, &node->input);
@@ -9295,9 +9320,16 @@  struct i40e_ethertype_filter *
 	if (add) {
 		ethertype_filter = rte_zmalloc("ethertype_filter",
 				       sizeof(*ethertype_filter), 0);
+		if (ethertype_filter == NULL) {
+			PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+			return -ENOMEM;
+		}
+
 		rte_memcpy(ethertype_filter, &check_filter,
 			   sizeof(check_filter));
 		ret = i40e_sw_ethertype_filter_insert(pf, ethertype_filter);
+		if (ret < 0)
+			rte_free(ethertype_filter);
 	} else {
 		ret = i40e_sw_ethertype_filter_del(pf, &node->input);
 	}
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index a4320b1..c392dc4 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -1595,8 +1595,15 @@  static int i40e_sw_fdir_filter_insert(struct i40e_pf *pf,
 	if (add) {
 		fdir_filter = rte_zmalloc("fdir_filter",
 					  sizeof(*fdir_filter), 0);
+		if (fdir_filter == NULL) {
+			PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+			return -ENOMEM;
+		}
+
 		rte_memcpy(fdir_filter, &check_filter, sizeof(check_filter));
 		ret = i40e_sw_fdir_filter_insert(pf, fdir_filter);
+		if (ret < 0)
+			rte_free(fdir_filter);
 	} else {
 		ret = i40e_sw_fdir_filter_del(pf, &node->fdir.input);
 	}