I wrote:
> I don't think it's a race condition per se. The code ought to be
> setting up the address argument for bind() with sin_port = 0 so that
> an unused port number gets assigned. That seems to be what happens on
> a couple of machines that I tried here, but I notice that the Linux
> manpage for getaddrinfo says
> service sets the port in each returned address structure. If
> this argument is a service name (see services(5)), it is
> translated to the corresponding port number. This argument can
> also be specified as a decimal number, which is simply converted
> to binary. If service is NULL, then the port number of the
> returned socket addresses will be left uninitialized.
> In principle this wording would allow getaddrinfo to return the same
> nonzero port number in multiple backends, which would lead to the
> reported failure if they were doing ident verification at the same time.
> I'm thinking maybe we should explicitly pass "0" rather than NULL to
> getaddrinfo here. On the other hand, it seems to work reliably as-is
> on my Linux machine, so this is just speculation at this point.
I looked at the glibc source code for getaddrinfo, and it looks like
they do reliably set sin_port to zero when no service argument is
provided, despite the above documentation statement. So that's why it
works for me. But still, if you're on a non-Linux platform it seems
possible that this is the mechanism for what's biting you.
regards, tom lane