Re: bind() to ::1 fails with EADDRNOTAVAIL / clang vs gcc

From: Jan Schaumann via freebsd-net <freebsd-net_at_freebsd.org>
Date: Wed, 24 Nov 2021 03:36:58 UTC
Jan Schaumann via freebsd-net <freebsd-net@freebsd.org> wrote:
> Konstantin Belousov <kostikbel@gmail.com> wrote:
> > On Tue, Nov 23, 2021 at 09:08:39PM -0500, Jan Schaumann via freebsd-net wrote:
> 
> > > - Why does _any_ of those fail?
> > > - Why does a.c succeed when compiled with clang, but
> > >   b.c does not?
> > Most likely because you did not fully initialized *sin.
> 
> > Really it is UB, try to memset(sin, 0, sizeof(*sin)).
> 
> Nice, that works.

Specifically, it looks like it's the sin6_scope_id
that matters here:  In the case where we have
additional stack variables, 'sin->sin6_scope_id' ends
up being set to '0', while in the other case it
retains a random value.  The random value then means
that we're trying to bind not "::1", but
"::1%<value>", which is why this fails.

Fun.

-Jan