On Fri, Nov 27, 2020 at 09:41:21PM +0100, Florian Obser wrote:
> An interface might have disappeared or switched rdomains while we
> waited for a FD. It's not a fatal condition if it arrives late.
That makes sense.
> I can only get it to lose the race by introducing a sleep in the
> parent process, but the race is still there. Found while implementing
> rdomain support in rad(8) using the same pattern.
I did not manage to reproduce this in rdomain rad, but I didn't try very
hard. I understand the race now.
ok tb
> I'm now wondering if it would be better to listen on the route socket
> for interface arrivals / departure in the parent process instead of
> the frontend asking for a raw socket to be opened. But that's a diff
> for another time.
>
> OK?
>
> diff --git frontend.c frontend.c
> index 4b3f575611e..7efbe50df20 100644
> --- frontend.c
> +++ frontend.c
> @@ -1164,9 +1164,14 @@ set_icmp6sock(int icmp6sock, int rdomain)
> }
> }
>
> - if (icmp6sock != -1)
> - fatalx("received unneeded ICMPv6 socket for rdomain %d",
> - rdomain);
> + if (icmp6sock != -1) {
> + /*
> + * The interface disappeared or changed rdomain while we were
> + * waiting for the parent process to open the raw socket.
> + */
> + close(icmp6sock);
> + return;
> + }
>
> LIST_FOREACH (iface, &interfaces, entries) {
> if (event_initialized(&iface->icmp6ev->ev) &&
>
> --
> I'm not entirely sure you are real.
>