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> --- ndctl/namespace.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ndctl/namespace.c b/ndctl/namespace.c index bb0c2f2e28c7..5eb9e1e98e11 100644 --- a/ndctl/namespace.c +++ b/ndctl/namespace.c @@ -2133,7 +2133,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; } } @@ -2144,11 +2144,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; @@ -2207,7 +2207,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); @@ -2286,9 +2286,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 @@ -2303,6 +2300,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