fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res){	struct trie *t = (struct trie *) tb->tb_data;	int order, last_idx;	struct fib_info *fi = NULL;	struct fib_info *last_resort;	struct fib_alias *fa = NULL;	struct list_head *fa_head;	struct leaf *l;	last_idx = -1;	last_resort = NULL;	order = -1;	read_lock(&fib_lock);		l = fib_find_node(t, 0);	if(!l) 		goto out;	fa_head = get_fa_head(l, 0);	if(!fa_head)		goto out;	if (list_empty(fa_head)) 		goto out;	list_for_each_entry(fa, fa_head, fa_list) {		struct fib_info *next_fi = fa->fa_info;				if (fa->fa_scope != res->scope ||		    fa->fa_type != RTN_UNICAST)			continue;				if (next_fi->fib_priority > res->fi->fib_priority)			break;		if (!next_fi->fib_nh[0].nh_gw ||		    next_fi->fib_nh[0].nh_scope != RT_SCOPE_LINK)			continue;		fa->fa_state |= FA_S_ACCESSED;				if (fi == NULL) {			if (next_fi != res->fi)				break;		} else if (!fib_detect_death(fi, order, &last_resort,					     &last_idx, &trie_last_dflt)) {			if (res->fi)				fib_info_put(res->fi);			res->fi = fi;			atomic_inc(&fi->fib_clntref);			trie_last_dflt = order;			goto out;		}		fi = next_fi;		order++;	}	if (order <= 0 || fi == NULL) {		trie_last_dflt = -1;		goto out;	}	if (!fib_detect_death(fi, order, &last_resort, &last_idx, &trie_last_dflt)) {		if (res->fi)			fib_info_put(res->fi);		res->fi = fi;		atomic_inc(&fi->fib_clntref);		trie_last_dflt = order;		goto out;	}	if (last_idx >= 0) {		if (res->fi)			fib_info_put(res->fi);		res->fi = last_resort;		if (last_resort)			atomic_inc(&last_resort->fib_clntref);	}	trie_last_dflt = last_idx; out:;	read_unlock(&fib_lock);	}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/c877efb207bf4629cfa97ac13412f7392a873485/fib_trie.c/buggy/net/ipv4/fib_trie.c