From mboxrd@z Thu Jan 1 00:00:00 1970 From: "John W. Linville" Subject: Re: [PATCH 2/7] ethtool: avoid resource leak of strings in do_gprivflags Date: Tue, 4 Oct 2016 10:02:24 -0400 Message-ID: <20161004140223.GA12675@tuxdriver.com> References: <1475265381-28937-1-git-send-email-linville@tuxdriver.com> <1475265381-28937-3-git-send-email-linville@tuxdriver.com> <20161003175426.GC43474@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev@vger.kernel.org To: Jarod Wilson Return-path: Received: from charlotte.tuxdriver.com ([70.61.120.58]:43348 "EHLO smtp.tuxdriver.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751862AbcJDOPR (ORCPT ); Tue, 4 Oct 2016 10:15:17 -0400 Content-Disposition: inline In-Reply-To: <20161003175426.GC43474@redhat.com> Sender: netdev-owner@vger.kernel.org List-ID: On Mon, Oct 03, 2016 at 01:54:26PM -0400, Jarod Wilson wrote: > On Fri, Sep 30, 2016 at 03:56:16PM -0400, John W. Linville wrote: > > Coverity issue: 1363119 > > Fixes: e1ee596326ae ("Add support for querying and setting private flags") > > > > Signed-off-by: John W. Linville > > --- > > ethtool.c | 18 +++++++++++++----- > > 1 file changed, 13 insertions(+), 5 deletions(-) > > > > diff --git a/ethtool.c b/ethtool.c > > index aa3ef5ed2f75..0885a61097ad 100644 > > --- a/ethtool.c > > +++ b/ethtool.c > > @@ -4205,7 +4205,7 @@ static int do_gprivflags(struct cmd_context *ctx) > > struct ethtool_gstrings *strings; > > struct ethtool_value flags; > > unsigned int i; > > - int max_len = 0, cur_len; > > + int max_len = 0, cur_len, rc; > > > > if (ctx->argc != 0) > > exit_bad_args(); > > @@ -4215,11 +4215,13 @@ static int do_gprivflags(struct cmd_context *ctx) > > 1); > > if (!strings) { > > perror("Cannot get private flag names"); > > - return 1; > > + rc = 1; > > + goto err; > > This goto looks redundant, since all you're doing at err is re-checking if > strings is non-null to free it. True, the original return is just as good there. And since strings is non-NULL for everything after that, the NULL check at error can be eliminated as well... Thanks! John > > if (strings->len == 0) { > > fprintf(stderr, "No private flags defined\n"); > > - return 1; > > + rc = 1; > > + goto err; > > } > > if (strings->len > 32) { > > /* ETHTOOL_GPFLAGS can only cover 32 flags */ > > @@ -4230,7 +4232,8 @@ static int do_gprivflags(struct cmd_context *ctx) > > flags.cmd = ETHTOOL_GPFLAGS; > > if (send_ioctl(ctx, &flags)) { > > perror("Cannot get private flags"); > > - return 1; > > + rc = 1; > > + goto err; > > } > > > > /* Find longest string and align all strings accordingly */ > > @@ -4248,7 +4251,12 @@ static int do_gprivflags(struct cmd_context *ctx) > > (const char *)strings->data + i * ETH_GSTRING_LEN, > > (flags.data & (1U << i)) ? "on" : "off"); > > > > - return 0; > > + rc = 0; > > + > > +err: > > + if (strings) > > + free(strings); > > + return rc; > > } > > > > static int do_sprivflags(struct cmd_context *ctx) > > -- > > 2.7.4 > > > > -- > Jarod Wilson > jarod@redhat.com > > > -- John W. Linville Someday the world will need a hero, and you linville@tuxdriver.com might be all we have. Be ready.