The branch main has been updated by dougm:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=ed5183455e4667ab92ff6f9d20cacaddb0a28909

commit ed5183455e4667ab92ff6f9d20cacaddb0a28909
Author:     Doug Moore <[email protected]>
AuthorDate: 2022-09-27 17:13:50 +0000
Commit:     Doug Moore <[email protected]>
CommitDate: 2022-09-27 17:24:01 +0000

    register_oid: fix duplicate oid after d3f96f661050
    
    sysctl_register_oid must check the uniqueness of any newly computed
    oid_number in sysctl_register_oid.
    
    Reviewed by:    asomers
    MFC with:       d3f96f661050
    Differential Revision:  https://reviews.freebsd.org/D36743
---
 sys/kern/kern_sysctl.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 1a3fcbbf8ae0..a31c8f97daa1 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -479,10 +479,9 @@ sysctl_register_oid(struct sysctl_oid *oidp)
        /*
         * Insert the OID into the parent's list sorted by OID number.
         */
-retry:
        key.oid_number = oid_number;
-       p = RB_FIND(sysctl_oid_list, parent, &key);
-       if (p) {
+       p = RB_NFIND(sysctl_oid_list, parent, &key);
+       while (p != NULL && oid_number == p->oid_number) {
                /* get the next valid OID number */
                if (oid_number < CTL_AUTO_START ||
                    oid_number == 0x7fffffff) {
@@ -491,10 +490,12 @@ retry:
                        /* don't loop forever */
                        if (!timeout--)
                                panic("sysctl: Out of OID numbers\n");
-                       goto retry;
-               } else {
-                       oid_number++;
+                       key.oid_number = oid_number;
+                       p = RB_NFIND(sysctl_oid_list, parent, &key);
+                       continue;
                }
+               p = RB_NEXT(sysctl_oid_list, NULL, p);
+               oid_number++;
        }
        /* check for non-auto OID number collision */
        if (oidp->oid_number >= 0 && oidp->oid_number < CTL_AUTO_START &&

Reply via email to