From d6ddb869d26b9bf973b27926265ea63c6a1e9aa0 Mon Sep 17 00:00:00 2001 From: qingli Date: Tue, 7 Feb 2006 20:25:39 +0000 Subject: The code in rn_walktree_from() that checks if we backed up too far did not stop at the right node. Change the backtracking check from smaller-than to smaller-or-equal to prevent this from happening. While here fix one additional problem where the insertion of the default route traversed the entire tree. PR: kern/38752 Submitted by: qingli (before I became committer) Reviewed by: andre MFC after: 3 days --- sys/net/radix.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'sys/net/radix.c') diff --git a/sys/net/radix.c b/sys/net/radix.c index 3e8ef97..0f718b7 100644 --- a/sys/net/radix.c +++ b/sys/net/radix.c @@ -1006,7 +1006,7 @@ rn_walktree_from(h, a, m, f, w) rn = rn->rn_parent; /* if went up beyond last, stop */ - if (rn->rn_bit < lastb) { + if (rn->rn_bit <= lastb) { stopping = 1; /* printf("up too far\n"); */ /* @@ -1018,6 +1018,14 @@ rn_walktree_from(h, a, m, f, w) */ } } + + /* + * At the top of the tree, no need to traverse the right + * half, prevent the traversal of the entire tree in the + * case of default route. + */ + if (rn->rn_parent->rn_flags & RNF_ROOT) + stopping = 1; /* Find the next *leaf* since next node might vanish, too */ for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) -- cgit v1.1