linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: "Michal Suchánek" <msuchanek@suse.de>
Cc: SF Markus Elfring <elfring@users.sourceforge.net>,
	linux-integrity@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	kernel-janitors@vger.kernel.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 4/4] char/tpm: Less checks in tpm_ibmvtpm_probe() after error detection
Date: Thu, 19 Oct 2017 17:59:36 +0300	[thread overview]
Message-ID: <20171019145936.4tygxazuuawzs3pa@mwanda> (raw)
In-Reply-To: <20171019161637.7eaba6e4@kitsune.suse.cz>

On Thu, Oct 19, 2017 at 04:16:37PM +0200, Michal Suchánek wrote:
> On Thu, 19 Oct 2017 16:36:46 +0300
> Dan Carpenter <dan.carpenter@oracle.com> wrote:
> 
> > On Thu, Oct 19, 2017 at 01:56:32PM +0200, Michal Suchánek wrote:
> > > 
> > > I think a single cleanup section is better than many labels that
> > > just avoid a single null check.
> > >  
> > 
> > I am not a big advocate of churn, but one err style error handling is
> > really bug prone.
> > 
> > I'm dealing with static analysis so most of the bugs I see are error
> > handling bugs.  
> 
> But it looks like you do not deal much with actual code development
> because then you would know that some of the changes proposed by the
> static analysis lead to errors later when the code dynamically changes.
> 

This is silly...  Anyway, my record is there in git.  I mostly send
bugfixes, and not cleanups.  In terms of patches that are merged, I
probably have introduced one or two runtime bugs per year over the past
decade.

> > That's because error handling is hard to test but easy
> > for static analysis.  One err style error handling is the worst
> > because you get things like:
> > 
> > fail:
> > 	kfree(foo->bar);
> > 	kfree(foo);
> > 
> > Oops, foo->bar is a NULL dereference.  And generally, it's a bad thing
> > to free things that haven't been allocated so, for example, I see
> > refcounting bugs in error handling paths as well where we decrement
> > something that wasn't incremented.  Freeing everything is more
> > complicated than just freeing one specific thing the way standard
> > kernel error handling works.
> 
> It depends on the function in question. If it only allocates memory
> which is not reference-counted and kfree() checks for the null in most
> cases it is easier to do just one big cleanup.
> 

No.  Just always do it standard way.  If there is only one error
condition just free it directly:

	if (invalid) {
		free(foo);
		return -EINVAL;
	}

But once you add a second error condition then use gotos.  There is no
reason to deviate from the standard.

> If it is more complex more labels are preferable.
> 
> > 
> > > As long as you can tell easily which resources were already
> > > allocated and need to be freed it is saner to keep only one cleanup
> > > section. 
> > 
> > Sure, if the function is simple and short then the error handling is
> > normally simple and short.  This is true for any style of error
> > handling.
> > 
> > > If the code doing the allocation is changed in the future the single
> > > cleanup can stay whereas multiple labels have to be rewritten
> > > again.  
> > 
> > No, they don't unless you choose bad label names.  
> 
> You obviously miss the fact that resource allocation is not always
> added at the end of the function.
> 

No, in my example, the new allocation was added to the *start* not the
end.  It doesn't matter though, standard error handling works the same
either way.

> You may need to reorder the code and hence the order of allocation or
> add allocation at the start. Both of these cases break multiple labels
> and special cases but work with one big cleanup just fine.

No, You don't need to re-order the labels or change them.  The label
name says what is freed.  The order is the reverse order from how they
were allocated.  It's very simple.  You just have to keep track of the
most recently allocated thing:

	foo = alloc();
	if (!foo)
		return -ENOMEM;

	bar = alloc();
	if (!bar)
		goto free_foo;

	baz = alloc();
	if (!baz)
		goto free_bar;

You can tell this code doesn't leak just from looking at the label
names.

regards,
dan carpenter

  reply	other threads:[~2017-10-19 14:59 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-16 17:30 [PATCH 0/4] char-TPM: Adjustments for ten function implementations SF Markus Elfring
2017-10-16 17:31 ` [PATCH 1/4] char/tpm: Delete an error message for a failed memory allocation in tpm_ascii_bios_measurements_show() SF Markus Elfring
2017-10-16 17:32 ` [PATCH 2/4] char/tpm: Delete an error message for a failed memory allocation in tpm_ibmvtpm_probe() SF Markus Elfring
2017-10-16 17:33 ` [PATCH 3/4] char/tpm: Improve a size determination in nine functions SF Markus Elfring
2017-10-17 11:03   ` Andy Shevchenko
2017-10-17 11:50     ` Alexander.Steffen
2017-10-17 12:52       ` Mimi Zohar
2017-10-17 12:58         ` Julia Lawall
2017-10-17 15:17           ` Mimi Zohar
2017-10-17 15:29             ` Julia Lawall
2017-10-18  9:16               ` Alexander.Steffen
2017-10-17 18:41             ` SF Markus Elfring
2017-10-17 19:28               ` Mimi Zohar
2017-10-17 20:04                 ` SF Markus Elfring
2017-10-17 19:36               ` Andy Shevchenko
2017-10-17 20:24                 ` SF Markus Elfring
2017-10-18 14:57               ` Jarkko Sakkinen
2017-10-18 15:22                 ` SF Markus Elfring
2017-10-18 15:59                   ` Jarkko Sakkinen
2017-10-18 16:43                     ` SF Markus Elfring
2017-10-18 17:18                       ` Jarkko Sakkinen
2017-10-18 17:22                         ` Jarkko Sakkinen
2017-10-18 17:54                           ` SF Markus Elfring
2017-10-18 17:48                         ` SF Markus Elfring
2017-10-18 17:54                           ` Jerry Snitselaar
2017-10-18 18:11                             ` char/tpm: Delete an error message for a failed memory allocation in tpm_…() SF Markus Elfring
2017-10-18 18:03                           ` char/tpm: Improve a size determination in nine functions Andy Shevchenko
2017-10-19 12:04                             ` Michal Suchánek
2017-10-19 12:16                           ` Jarkko Sakkinen
2017-10-17 13:02         ` [PATCH 3/4] " Andy Shevchenko
2017-10-18 14:52           ` Jarkko Sakkinen
2017-10-17 15:22         ` Alexander.Steffen
2017-10-18 14:48       ` Jarkko Sakkinen
2017-10-19 16:58         ` Alexander.Steffen
2017-10-20  9:01           ` Jarkko Sakkinen
2017-10-20 10:23             ` Jarkko Sakkinen
2017-10-20 12:03               ` Alexander.Steffen
2017-10-23 13:20           ` Dan Carpenter
2017-10-18 14:40     ` Jarkko Sakkinen
2017-10-16 17:34 ` [PATCH 4/4] char/tpm: Less checks in tpm_ibmvtpm_probe() after error detection SF Markus Elfring
2017-10-19 11:56   ` Michal Suchánek
2017-10-19 12:36     ` SF Markus Elfring
2017-10-19 12:46       ` Michal Suchánek
2017-10-19 14:26         ` Dan Carpenter
2017-10-19 13:36     ` Dan Carpenter
2017-10-19 14:16       ` Michal Suchánek
2017-10-19 14:59         ` Dan Carpenter [this message]
2017-10-19 20:44       ` SF Markus Elfring
2017-10-16 18:31 ` [PATCH 0/4] char-TPM: Adjustments for ten function implementations Jarkko Sakkinen
2017-10-16 18:35   ` Jarkko Sakkinen
2017-10-16 20:44     ` SF Markus Elfring
2017-10-18 15:04       ` Jarkko Sakkinen
2017-10-18 15:43         ` SF Markus Elfring
2017-10-16 22:46     ` [PATCH 0/4] " Joe Perches
2017-10-17  7:20       ` SF Markus Elfring
2017-10-17  8:51     ` Dan Carpenter
2017-10-17  8:56       ` Julia Lawall
2017-10-17  9:44         ` Dan Carpenter
2017-10-17 10:11           ` Julia Lawall
2017-10-17 11:52             ` Mimi Zohar
2017-10-18  3:18               ` Michael Ellerman
2017-10-19 13:16                 ` Mimi Zohar
2017-10-19 16:08                   ` Circumstances for using the tag “Fixes” (or not) SF Markus Elfring
2017-10-17 12:26           ` [PATCH 0/4] char-TPM: Adjustments for ten function implementations Michael Ellerman
2017-10-18 15:07           ` Jarkko Sakkinen
2017-10-17  9:25       ` SF Markus Elfring
2017-10-17 15:57         ` James Bottomley
2017-10-17 16:32           ` SF Markus Elfring
2017-10-17 22:43           ` Joe Perches
2017-10-18  9:00             ` SF Markus Elfring
2017-10-18  9:18               ` Joe Perches
2017-10-18  9:50                 ` Alexander.Steffen
2017-10-18 10:00                   ` Julia Lawall
2017-10-18 10:28                     ` Joe Perches
2017-10-18 11:00                       ` Adjusting further size determinations? SF Markus Elfring
2017-10-18 11:49                         ` Joe Perches
2017-10-18 12:07                           ` SF Markus Elfring
2017-10-18 12:58                             ` David Laight
2017-10-18 13:32                               ` Julia Lawall
2017-10-18 13:50                                 ` SF Markus Elfring
2017-10-18 10:44                     ` char-TPM: Adjustments for ten function implementations Alexander.Steffen
2017-10-18 10:49                       ` Joe Perches
2017-10-18 11:07                         ` Alexander.Steffen
2017-10-18  9:55                 ` SF Markus Elfring
2017-10-18 18:27                 ` Michal Suchánek
2017-10-18 15:10           ` [PATCH 0/4] " Jarkko Sakkinen
2017-10-18 16:09             ` James Bottomley
2017-10-18 17:13               ` Jarkko Sakkinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171019145936.4tygxazuuawzs3pa@mwanda \
    --to=dan.carpenter@oracle.com \
    --cc=elfring@users.sourceforge.net \
    --cc=kernel-janitors@vger.kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=msuchanek@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).