Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Sep 2001 22:27:10 +0200 (CEST)
From:      Christian Carstensen <cc@devcon.net>
To:        <current@freebsd.org>
Subject:   problem with dynamic sysctls in -current
Message-ID:  <Pine.BSF.4.33.0109082222050.1392-100000@albert.gate5.de>

next in thread | raw e-mail | index | archive | help

hmm,

i've posted the attached mail a week ago to this list, but got no
response. could someone please comment on this issue?


thanks,
  christian

---------- Forwarded message ----------
Date: Sat, 1 Sep 2001 03:26:46 +0200 (CEST)
From: Christian Carstensen <cc@devcon.net>
To: current@freebsd.org
Subject: dynamic sysctl problem and proposed hot fix


hi,

i just came across a problem with dynamic sysctls:
when unloading a driver module that used dyn sysctls, my system paniced
with "oid too high". that problem is caused by sysctl_ctx_free() in
kern/kern_sysctl.c, that first deregisters all oids in the list to see if
a error occurs. then, all oids are being reregistered and, if there was no
error, they're finally removed.
during the second phase, sysctl_register_oid(e1->entry) is called with
n := e1->entry->oid_number being the old oid number with n > CTL_AUTO_START.
that leads to panic("static sysctl too high") in sysctl_register_oid.
one approach might be to initialize the oid_number field to contain the
value OID_AUTO before calling sysctl_regiser_oid, but i'm unsure about the
side effects of doing that in sysctl_ctx_free().
alternatively, the "old" oid number could be reused, the following patch
should do, but it's just a workaround.


best,
  christian

--
"Sorry, no defects found. Please try a different search"
                          [http://www.cisco.com/support/bugtools/bugtool.shtml]


Index: kern_sysctl.c
===================================================================
RCS file: /usr/cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.113
diff -r1.113 kern_sysctl.c
83a84,96
> static struct sysctl_oid *
> sysctl_find_oidnumber(const int number, struct sysctl_oid_list *list)
> {
>       struct sysctl_oid *oidp;
>
>       SLIST_FOREACH(oidp, list, oid_link) {
>               if (oidp->oid_number == number) {
>                       return (oidp);
>               }
>       }
>       return (NULL);
> }
>
125c138,139
<               panic("static sysctl oid too high: %d", oidp->oid_number);
---
>               if (sysctl_find_oidnumber(oidp->oid_number, parent))
>                       panic("static sysctl oid too high: %d", oidp->oid_number);
177c191
<               if (error)
---
>               if (error)




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.33.0109082222050.1392-100000>