diff mbox series

[21/24] lnet: Memory leak on adding existing interface

Message ID 1662429337-18737-22-git-send-email-jsimmons@infradead.org (mailing list archive)
State New, archived
Headers show
Series lustre: update to OpenSFS tree Sept 5, 2022 | expand

Commit Message

James Simmons Sept. 6, 2022, 1:55 a.m. UTC
From: Frank Sehr <fsehr@whamcloud.com>

In the function lnet_dyn_add_ni an lnet_ni structure is allocated.
In case of an error the function returns without freeing the memory of
the structure.
Added handling of possible lnet_net structure memory leaks.

WC-bug-id: https://jira.whamcloud.com/browse/LU-16081
Lustre-commit: 26beb8664f4533a6e ("LU-16081 lnet: Memory leak on adding existing interface")
Signed-off-by: Frank Sehr <fsehr@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/48173
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 net/lnet/lnet/api-ni.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/net/lnet/lnet/api-ni.c b/net/lnet/lnet/api-ni.c
index 0449136..9bf2860 100644
--- a/net/lnet/lnet/api-ni.c
+++ b/net/lnet/lnet/api-ni.c
@@ -3551,25 +3551,34 @@  int lnet_dyn_add_ni(struct lnet_ioctl_config_ni *conf)
 		return -ENOMEM;
 
 	for (i = 0; i < conf->lic_ncpts; i++) {
-		if (conf->lic_cpts[i] >= LNET_CPT_NUMBER)
+		if (conf->lic_cpts[i] >= LNET_CPT_NUMBER) {
+			lnet_net_free(net);
 			return -EINVAL;
+		}
 	}
 
 	ni = lnet_ni_alloc_w_cpt_array(net, conf->lic_cpts, conf->lic_ncpts,
 				       conf->lic_ni_intf);
-	if (!ni)
+	if (!ni) {
+		lnet_net_free(net);
 		return -ENOMEM;
+	}
 
 	lnet_set_tune_defaults(tun);
 
 	mutex_lock(&the_lnet.ln_api_mutex);
-	if (the_lnet.ln_state != LNET_STATE_RUNNING)
+	if (the_lnet.ln_state != LNET_STATE_RUNNING) {
+		lnet_net_free(net);
 		rc = -ESHUTDOWN;
-	else
+	} else {
 		rc = lnet_add_net_common(net, tun);
+	}
 
 	mutex_unlock(&the_lnet.ln_api_mutex);
 
+	if (rc)
+		lnet_ni_free(ni);
+
 	return rc;
 }