diff options
| -rw-r--r-- | zebra/connected.c | 5 | ||||
| -rw-r--r-- | zebra/interface.c | 17 | 
2 files changed, 19 insertions, 3 deletions
| diff --git a/zebra/connected.c b/zebra/connected.c index 05538c5d..3db1271d 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -49,8 +49,9 @@ connected_withdraw (struct connected *ifc)      {        zebra_interface_address_delete_update (ifc->ifp, ifc); -      if_subnet_delete (ifc->ifp, ifc); -       +      if (ifc->address->family == AF_INET) +        if_subnet_delete (ifc->ifp, ifc); +        if (ifc->address->family == AF_INET)          connected_down_ipv4 (ifc->ifp, ifc);  #ifdef HAVE_IPV6 diff --git a/zebra/interface.c b/zebra/interface.c index 3578b790..baa7ab63 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -161,11 +161,26 @@ if_subnet_delete (struct interface *ifp, struct connected *ifc)    /* Get address derived subnet node. */    rn = route_node_lookup (zebra_if->ipv4_subnets, ifc->address);    if (! (rn && rn->info)) -    return -1; +    { +      zlog_warn("Trying to remove an address from an unknown subnet." +                " (please report this bug)"); +      return -1; +    }    route_unlock_node (rn);    /* Untie address from subnet's address list. */    addr_list = rn->info; + +  /* Deleting an address that is not registered is a bug. +   * In any case, we shouldn't decrement the lock counter if the address +   * is unknown. */ +  if (!listnode_lookup(addr_list, ifc)) +    { +      zlog_warn("Trying to remove an address from a subnet where it is not" +                " currently registered. (please report this bug)"); +      return -1; +    } +    listnode_delete (addr_list, ifc);    route_unlock_node (rn); | 
