Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Sep 2022 17:24:22 GMT
From:      Doug Moore <dougm@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ed5183455e46 - main - register_oid: fix duplicate oid after d3f96f661050
Message-ID:  <202209271724.28RHOMWm075714@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by dougm:

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

commit ed5183455e4667ab92ff6f9d20cacaddb0a28909
Author:     Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2022-09-27 17:13:50 +0000
Commit:     Doug Moore <dougm@FreeBSD.org>
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 &&



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202209271724.28RHOMWm075714>