Re: bind() to ::1 fails with EADDRNOTAVAIL / clang vs gcc
- In reply to: Jan Schaumann via freebsd-net : "Re: bind() to ::1 fails with EADDRNOTAVAIL / clang vs gcc"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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