An interface might have disappeared or switched rdomains while we waited for a FD. It's not a fatal condition if it arrives late.
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'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.