git/list[1] front-page[2] threads[3] people[4] search[5] about
 

RE: [Proposed Fix] daemon.c: not initializing revents

From
Randall S. Becker <rsbecker@nexbridge.com>
Date
Feb 11, 2019, 21:44 UTC
Message-ID
<003501d4c253$05f16fd0$11d44f70$@nexbridge.com>
In-Reply-To
<xmqqsgwugi21.fsf@gitster-ct.c.googlers.com>
On February 11, 2019 15:57, Junio C Hamano wrote:
Show 14 quoted lines
> "Randall S. Becker" <rsbecker@nexbridge.com> writes:
> 
> > Hi All,
> >
> > I found this while trying to track down a hang in t5562 - this isn't
> > the fix, but here it is something that could be considered a
> > code-inspection. If there have been random unexplained hangs when git
> > runs as a daemon, this might be the cause.
> >
> > According to many systems (other than Linux), the revents field is
> > supposed to be 0 on return to poll(). This was the cause of some
> > heart-ache a while back in compat/poll/poll.c.
> 
> I am having a hard time grokking "supposed to be 0 on return to", but do
you
Show 14 quoted lines
> mean "the caller must clear .revents field before calling poll()"?
> 
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html
> has this
> 
>     In each pollfd structure, poll() shall clear the revents member,
>     except that where the application requested a report on a condition
>     by setting one of the bits of events listed above, poll() shall set
>     the corresponding bit in revents if the requested condition is
>     true. In addition, poll() shall set the POLLHUP, POLLERR, and
>     POLLNVAL flag in revents if the condition is true, even if the
>     application did not set the corresponding bit in events.
> 
> and I am also having a hard time interpreting the "except that".  If we
asked
> to report (e.g. we set POLLIN in the .events field), poll() does not have
to
> clear .revents but just set whatever bits it needs to set to report the
> condition in the field?
> 
> If that is the case, it makes it a bug not to clear .revents before
calling poll;
> the sample code snippet on the same page in EXAMPLES section does not,
> though, so I am puzzled.
> 
> In any case, no matter what POSIX says, if clearing .revents before
calling
> poll() helps on platforms in the real world, the patch is worth taking as
a fix, I
> would think.

That's what my intent was - my explanations are suffering from a little work-induced sleep deprivation. Would you like this as a formal patch?

Show 13 quoted lines
> 
> > I am not certain whether that copy of poll() is used in daemon, but I
> > wanted to point out that the value is being returned to poll, outside
> > of compat/poll/poll.c and may present a potential for poll returning
> > an error on that FD due to random values that might be in revents.
> >
> > Please see 61b2a1acaae for a related change/justification.
> >
> > diff --git a/daemon.c b/daemon.c
> > index 9d2e0d20ef..1e275fc8b3 100644
> > --- a/daemon.c
> > +++ b/daemon.c
> > @@ -1194,6 +1194,7 @@ static int service_loop(struct socketlist
*socklist)
Show 7 quoted lines
> >                                 }
> >                                 handle(incoming, &ss.sa, sslen);
> >                         }
> > +                       pfd[i].revents = 0;
> >                 }
> >         }
> >  }

Regards, Randall

Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 5 in “[Proposed Fix] daemon.c: not initializing revents”
  1. Randall S. BeckerFeb 9, 2019
  2. Junio C HamanoFeb 11, 2019
  3. Randall S. BeckerFeb 11, 2019
  4. Junio C HamanoFeb 12, 2019
  5. Randall S. BeckerFeb 12, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.