git: ed5183455e46 - main - register_oid: fix duplicate oid after d3f96f661050
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 27 Sep 2022 17:24:22 UTC
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 &&