aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Moore <dougm@FreeBSD.org>2022-09-27 17:13:50 +0000
committerDoug Moore <dougm@FreeBSD.org>2022-09-27 17:24:01 +0000
commited5183455e4667ab92ff6f9d20cacaddb0a28909 (patch)
treee9dea444ea5054f1615b73e951a21689eb8d728e
parentc075ea46bca6d48ce9f639e4575077d06d392427 (diff)
downloadsrc-ed5183455e4667ab92ff6f9d20cacaddb0a28909.tar.gz
src-ed5183455e4667ab92ff6f9d20cacaddb0a28909.zip
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
-rw-r--r--sys/kern/kern_sysctl.c13
1 files 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 &&