route: Don't install a cloned route when interface is down
authorRoy Marples <roy@marples.name>
Tue, 10 Sep 2019 11:00:36 +0000 (12:00 +0100)
committerRoy Marples <roy@marples.name>
Tue, 10 Sep 2019 11:00:36 +0000 (12:00 +0100)
When an interface is taken down, all subnet routes are removed
and thus all cloned routes are flushed.

It's possible, although unlikely, for userland to add a subnet
route when the interface is down.

In this state, EHOSTDOWN would be returned regardless, but a
cloned route would be created locked to the interface.
Instead, check if interface is down before creating the cloned
route so it's not made needlessly.

sys/net/route.c

index 763bf98..39246d4 100644 (file)
@@ -829,6 +829,9 @@ rtrequest1(int req, struct rt_addrinfo *rtinfo, struct rtentry **ret_nrt)
                if (ret_nrt == NULL || (rt = *ret_nrt) == NULL)
                        gotoerr(EINVAL);
 
+               if (!(rt->rt_ifp->if_flags & IFF_UP))
+                       gotoerr(ENETDOWN);
+
                KASSERT(rt->rt_cpuid == mycpuid,
                    ("rt resolve rt_cpuid %d, mycpuid %d",
                     rt->rt_cpuid, mycpuid));