Re: [PATCH v6 00/16] daemon-win32
- From
Martin Storsjö <martin@martin.st>
- Date
- Nov 4, 2010, 08:52 UTC
- Message-ID
- <alpine.DEB.2.00.1011041026160.31519@cone.home.martin.st>
- In-Reply-To
- <AANLkTim4_5dgPGcw5B3U-3UH63REL4QWsWPV=mDSJJ6D@mail.gmail.com>
On Wed, 3 Nov 2010, Erik Faye-Lund wrote:
Show 64 quoted lines
> On Wed, Nov 3, 2010 at 11:18 PM, Erik Faye-Lund <kusmabite@gmail.com> wrote:
> > On Wed, Nov 3, 2010 at 10:11 PM, Pat Thoyts
> > <patthoyts@users.sourceforge.net> wrote:
> >> Erik Faye-Lund <kusmabite@gmail.com> writes:
> >>
> >>>Here's hopefully the last iteration of this series. The previous version
> >>>only got a single complain about a typo in the subject of patch 14/15, so
> >>>it seems like most controversies have been settled.
> >>
> >> I pulled this win32-daemon branch into my msysgit build tree and built
> >> it. I get the following warnings:
> >>
> >> CC daemon.o
> >> daemon.c: In function 'service_loop':
> >> daemon.c:674: warning: dereferencing pointer 'ss.124' does break strict-aliasing rules
> >> daemon.c:676: warning: dereferencing pointer 'ss.124' does break strict-aliasing rules
> >> daemon.c:681: warning: dereferencing pointer 'ss.124' does break strict-aliasing rules
> >> daemon.c:919: note: initialized from here
> >> daemon.c:679: warning: dereferencing pointer 'sin_addr' does break strict-aliasing rules
> >> daemon.c:675: note: initialized from here
> >> daemon.c:691: warning: dereferencing pointer 'sin6_addr' does break strict-aliasing rules
> >> daemon.c:682: note: initialized from here
> >>
> >
> > Yeah, I'm aware of these. I thought those warnings were already
> > present in the Linux build, but checking again I see that that's not
> > the case. Need to investigate.
> >
>
> OK, it's the patch "daemon: use run-command api for async serving"
> that introduce the warning. But looking closer at the patch it doesn't
> seem the patch actually introduce the strict-aliasing violation, it's
> there already. The patch only seems to change the code enough for GCC
> to start realize there's a problem. Unless I'm misunderstanding
> something vital, that is.
>
> Anyway, here's a patch that makes it go away, I guess I'll squash it
> into the next round.
>
> diff --git a/daemon.c b/daemon.c
> index 6eee570..d636446 100644
> --- a/daemon.c
> +++ b/daemon.c
> @@ -1159,14 +1159,13 @@ int main(int argc, char **argv)
> }
>
> if (inetd_mode || serve_mode) {
> - struct sockaddr_storage ss;
> - struct sockaddr *peer = (struct sockaddr *)&ss;
> - socklen_t slen = sizeof(ss);
> + struct sockaddr sa;
> + socklen_t slen = sizeof(sa);
>
> - if (getpeername(0, peer, &slen))
> - peer = NULL;
> -
> - return execute(peer);
> + if (getpeername(0, &sa, &slen))
> + return execute(NULL);
> + else
> + return execute(&sa);
> }
>
> if (detach) {As you noticed later yourself, this is not right. You can get any kind of sockaddr back from getpeername. I'm not sure if any spec mandates that a "normal" sockaddr_in should fit into the base sockaddr, or if that just happens by coincidence or sheer luck.
// Martin