From 26beb8664f4533a6e8532e4277ee65292d63434c Mon Sep 17 00:00:00 2001 From: Frank Sehr Date: Tue, 9 Aug 2022 10:10:54 -0700 Subject: [PATCH] LU-16081 lnet: Memory leak on adding existing interface 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. Test-parameters: trivial testlist=sanity-lnet Signed-off-by: Frank Sehr Change-Id: I7544a9379093b99f77aaddb8d021b4a5bf221082 Reviewed-on: https://review.whamcloud.com/48173 Reviewed-by: Chris Horn Tested-by: jenkins Tested-by: Maloo Reviewed-by: Serguei Smirnov Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lnet/lnet/api-ni.c | 17 +++++++++++++---- lustre/tests/sanity-lnet.sh | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index 67e20b1..d4adae2 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -3641,25 +3641,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; } diff --git a/lustre/tests/sanity-lnet.sh b/lustre/tests/sanity-lnet.sh index b3c1fa1..28afdfd 100755 --- a/lustre/tests/sanity-lnet.sh +++ b/lustre/tests/sanity-lnet.sh @@ -3084,6 +3084,20 @@ test_300() { } run_test 300 "packaged LNet UAPI headers can be compiled" +# LU-16081 lnet: Memory leak on adding existing interface + +test_301() { + reinit_dlc || return $? + do_lnetctl net add --net tcp --if ${INTERFACES[0]} || + error "Failed to add net" + do_lnetctl net add --net tcp --if ${INTERFACES[0]} && + error "add net should have failed" + do_lnetctl net del --net tcp --if ${INTERFACES[0]} || + error "Failed to del net" + unload_modules +} +run_test 301 "Check for dynamic adds of same/wrong interface (memory leak)" + complete $SECONDS cleanup_testsuite -- 1.8.3.1