[systemd-devel] [PATCH 12/24] sd-dhcp6-client: Add DHCPv6 Solicit message creation and sending
Zbigniew Jędrzejewski-Szmek
zbyszek at in.waw.pl
Fri Jun 20 13:00:36 PDT 2014
On Fri, Jun 20, 2014 at 07:45:39PM +0200, Lennart Poettering wrote:
> On Thu, 19.06.14 14:52, Patrik Flykt (Patrik.Flykt at linux.intel.com) wrote:
>
> > On Wed, 2014-06-18 at 16:25 +0200, Zbigniew Jędrzejewski-Szmek wrote:
> > > On Wed, Jun 18, 2014 at 07:05:35AM -0700, Filipe Brandenburger wrote:
> > > > On Wed, Jun 18, 2014 at 6:58 AM, Zbigniew Jędrzejewski-Szmek
> > > > <zbyszek at in.waw.pl> wrote:
> > > > >> + if (client->fd > 0)
> > > > >> + safe_close(client->fd);
> > > > >> + client->fd = -1;
> > > > > client->fd = safe_close(client->fd);
> > > > >
> > > > > That's what safe_close is for :)
> > > >
> > > > And shouldn't the check be for client->fd >= 0? Zero is a valid file descriptor.
> > > Yeah... but note that safe_close already has the fd >= 0 check, so the
> > > replacement line replaces the if too.
> >
> > If I omit the client->fd > 0 check I get the following in the test case:
> >
> > Assertion 'close_nointr(fd) != -EBADF' failed at src/shared/util.c:205,
> > function safe_close(). Aborting.
>
> safe_close() is a call that will ignore all kinds of errors except one:
> EBADF. THe rationale for that is that the kernel has these weird
> semantics that close() might fail with errors like EIO or whatever else
> if something could't be written to disk or so, but the fd will still be
> closed. Hence, you can invoke safe_close() in all those cases where you
> just want to get rid of an fd, and don't care about anything else. Now,
> it will only trip up on one specific problem which always indicates a
> programming error: when close() returns EBADF, since that is the error
> that is returned when you invoke close() on an fd that doesn't exist.
>
> Putting this all together: safe_close() is basically your one stop
> solution to getting rid of fds, and even updating your variable you
> store it in:
>
> fd = safe_close(fd);
>
> safe_close() always returns -1, always gets rid of the fd, will be a NOP
> if the fd is < 0. Will never fail. However, it if you invoke it the only
> way that is a real programming error which is with an already-closed fd
> or a never-opened fd, then it will assert() and die.
>
> Hope this makes sense.
>
> Or long words short: if the code tripped up like yours above, this is no
> indication that safe_close() wasn't right. Instead it's an indication
> that you are passing it a rubbish fd.
Yeah, fixed in c806ffb.
Zbyszek
More information about the systemd-devel
mailing list