Date: Thu, 30 May 2002 16:01:36 -0700 From: "Qing Li" <Qing.Li@windriver.com> To: <FreeBSD-gnats-submit@FreeBSD.org> Subject: kern/38752: rn_walktree_from not halting at the right node Message-ID: <DMEGKJAJNLKBGDDBEAIPMEFPFCAA.Qing.Li@windriver.com>
next in thread | raw e-mail | index | archive | help
>Number: 38752 >Category: kern >Synopsis: rn_walktree_from not halting at the right node >Confidential: no >Severity: serious >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu May 30 16:10:02 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Qing Li >Release: FreeBSD 4.6-PRERELEASE i386 >Organization: >Environment: System: FreeBSD a.b.c 4.6-PRERELEASE FreeBSD 4.6-PRERELEASE #0: Wed May 15 16:17:16 GMT 2002 root@:/usr/obj/usr/src/sys/GENERIC i386 CPU: Pentium II/Pentium II Xeon/Celeron (265.37-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0x634 Stepping = 4 Features=0x80f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,M MX> real memory = 167772160 (163840K bytes) avail memory = 158183424 (154476K bytes) >Description: The code in "rn_walktree_from" that checks if we backed up too far did not stop at the right node. <snip> while (!stopping) { /* printf("node %p (%d)\n", rn, rn->rn_bit); */ base = rn; /* If at right child go back up, otherwise, go right */ while (rn->rn_parent->rn_right == rn && !(rn->rn_flags & RNF_ROOT)) { rn = rn->rn_parent; /* if went up beyond last, stop */ if (rn->rn_bit < lastb) { ^^^^^^^^^^^^^^^^^^^^^^^ ||||||||||||||||||||||| stopping = 1; /* printf("up too far\n"); */ } } /* Find the next *leaf* since next node might vanish, too */ for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) rn = rn->rn_left; <snip> The IF statement will be true after the complete traversal of the right branch of its parent, due to the "rn = rn->rn_parent->rn_right" assignment in the following FOR loop. One additional problem is the insertion of the default route will traverse the entire tree. >How-To-Repeat: Problem 1, Construct the routing tree to shape as the following: ROOT [o] | | [o] ____|_______ | | | (lastb) [o]------------[o] | | | | | | [o]-----{LF} {LF}------{LF} | | | {LF}------{LF} Problem 2, enable IPv6, and after system initialization, add a default route as in route add -net -inet6 default -inet6 fe80::2c0:4fff:fe8d:63b9%xl0 -netmask -inet6 default >Fix: *** radix.c Tue Apr 30 14:09:48 2002 --- radix.c.new Thu May 30 14:22:44 2002 *************** *** 942,952 **** rn = rn->rn_parent; /* if went up beyond last, stop */ ! if (rn->rn_bit < lastb) { stopping = 1; /* printf("up too far\n"); */ } } /* Find the next *leaf* since next node might vanish, too */ for (rn = rn->rn_parent->rn_right; rn->rn_bit >= 0;) --- 942,955 ---- rn = rn->rn_parent; /* if went up beyond last, stop */ ! if (rn->rn_bit <= lastb) { stopping = 1; /* printf("up too far\n"); */ } } + + 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;) >Release-Note: >Audit-Trail: >Unformatted: SEND-PR: -*- send-pr -*- SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as SEND-PR: will all comments (text enclosed in `<' and `>'). SEND-PR: SEND-PR: Please consult the following URL if you are not sure how to SEND-PR: fill out a problem report: SEND-PR: http://www.freebsd.org/doc/en/articles/problem-reports/article.html SEND-PR: SEND-PR: Note that the Synopsis field is mandatory. SEND-PR: SEND-PR: Please note that (unless you state otherwise) if your report SEND-PR: includes a patch then it will be taken under the same license as SEND-PR: the one on the file(s) you want to change. SEND-PR: SEND-PR: BE ADVISED THAT FREEBSD PROBLEM REPORTS ARE PUBLIC INFORMATION AND SEND-PR: WILL BE PUBLISHED AS-IS ON THE PROJECT'S MAILING LISTS AND WEB SITES. SEND-PR: DO NOT SUBMIT ANY INFORMATION YOU DO NOT WANT MADE PUBLIC. SEND-PR: SEND-PR: For sensitive security issues, consider contacting the FreeBSD SEND-PR: security officer team (security-officer@freebsd.org) directly. SEND-PR: SEND-PR: Choose from the following categories: SEND-PR: SEND-PR: advocacy alpha bin conf docs gnu SEND-PR: i386 kern misc ports sparc SEND-PR: To: FreeBSD-gnats-submit@freebsd.org From: Qing.Li@windriver.com Reply-To: Qing.Li@windriver.com Cc: X-send-pr-version: 3.113 X-GNATS-Notify: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?DMEGKJAJNLKBGDDBEAIPMEFPFCAA.Qing.Li>