Index: sys/kern/kern_sysctl.c =================================================================== --- sys/kern/kern_sysctl.c +++ sys/kern/kern_sysctl.c @@ -356,29 +356,22 @@ SYSCTL_ASSERT_LOCKED(); indx = 0; - while (indx < CTL_MAXNAME && indx >= 0) { - if (nodes[indx] == NULL && indx == 0) - nodes[indx] = RB_MIN(sysctl_oid_list, - &sysctl__children); - else if (nodes[indx] == NULL) - nodes[indx] = RB_MIN(sysctl_oid_list, - &nodes[indx - 1]->oid_children); - else - nodes[indx] = RB_NEXT(sysctl_oid_list, - &nodes[indx - 1]->oid_children, nodes[indx]); - + nodes[indx] = RB_MIN(sysctl_oid_list, &sysctl__children); + for (;;) { if (nodes[indx] == needle) return (indx + 1); if (nodes[indx] == NULL) { - indx--; - continue; - } - - if ((nodes[indx]->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - indx++; + if (indx-- == 0) + break; + } else if ((nodes[indx]->oid_kind & CTLTYPE) == CTLTYPE_NODE) { + if (++indx == CTL_MAXNAME) + break; + nodes[indx] = RB_MIN(sysctl_oid_list, + &nodes[indx - 1]->oid_children); continue; } + nodes[indx] = sysctl_oid_list_RB_NEXT(nodes[indx]); } return (-1); }