From: Alison Schofield <alison.schofi...@intel.com> A coverity scan highlighted a resource leak caused by not freeing the open file descriptor upon exit of do_xaction_namespace().
Move the fclose() to a 'goto out_close' and route all returns through that path. Signed-off-by: Alison Schofield <alison.schofi...@intel.com> Reviewed-by: Dave Jiang <dave.ji...@intel.com> --- ndctl/namespace.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ndctl/namespace.c b/ndctl/namespace.c index 372fc3747c88..6c86eadcad69 100644 --- a/ndctl/namespace.c +++ b/ndctl/namespace.c @@ -2134,7 +2134,7 @@ static int do_xaction_namespace(const char *namespace, util_display_json_array(ri_ctx.f_out, ri_ctx.jblocks, 0); if (rc >= 0) (*processed)++; - return rc; + goto out_close; } } @@ -2145,11 +2145,11 @@ static int do_xaction_namespace(const char *namespace, rc = file_write_infoblock(param.outfile); if (rc >= 0) (*processed)++; - return rc; + goto out_close; } if (!namespace && action != ACTION_CREATE) - return rc; + goto out_close; if (namespace && (strcmp(namespace, "all") == 0)) rc = 0; @@ -2208,7 +2208,7 @@ static int do_xaction_namespace(const char *namespace, saved_rc = rc; continue; } - return rc; + goto out_close; } ndctl_namespace_foreach_safe(region, ndns, _n) { ndns_name = ndctl_namespace_get_devname(ndns); @@ -2287,9 +2287,6 @@ static int do_xaction_namespace(const char *namespace, if (ri_ctx.jblocks) util_display_json_array(ri_ctx.f_out, ri_ctx.jblocks, 0); - if (ri_ctx.f_out && ri_ctx.f_out != stdout) - fclose(ri_ctx.f_out); - if (action == ACTION_CREATE && rc == -EAGAIN) { /* * Namespace creation searched through all candidate @@ -2304,6 +2301,10 @@ static int do_xaction_namespace(const char *namespace, else rc = -ENOSPC; } + +out_close: + if (ri_ctx.f_out && ri_ctx.f_out != stdout) + fclose(ri_ctx.f_out); if (saved_rc) rc = saved_rc; -- 2.37.3