--- x/net/netrom/nr_route.c +++ y/net/netrom/nr_route.c @@ -100,6 +100,7 @@ static int __must_check nr_add_node(ax25 { struct nr_node *nr_node; struct nr_neigh *nr_neigh; + struct nr_neigh *victim = NULL; int i, found; struct net_device *odev; @@ -245,8 +246,9 @@ static int __must_check nr_add_node(ax25 nr_node->routes[2].neighbour->count--; nr_neigh_put(nr_node->routes[2].neighbour); - if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked) - nr_remove_neigh(nr_node->routes[2].neighbour); + if (nr_node->routes[2].neighbour->count == 0 && + !nr_node->routes[2].neighbour->locked) + victim = nr_node->routes[2].neighbour; nr_node->routes[2].quality = quality; nr_node->routes[2].obs_count = obs_count; @@ -281,6 +283,8 @@ static int __must_check nr_add_node(ax25 nr_neigh_put(nr_neigh); nr_node_unlock(nr_node); + if (victim) + nr_remove_neigh(victim); nr_node_put(nr_node); return 0; }