diff options
author | Doug Moore <dougm@FreeBSD.org> | 2022-09-27 17:13:50 +0000 |
---|---|---|
committer | Doug Moore <dougm@FreeBSD.org> | 2022-09-27 17:24:01 +0000 |
commit | ed5183455e4667ab92ff6f9d20cacaddb0a28909 (patch) | |
tree | e9dea444ea5054f1615b73e951a21689eb8d728e | |
parent | c075ea46bca6d48ce9f639e4575077d06d392427 (diff) | |
download | src-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.c | 13 |
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 && |