Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Jun 2017 15:17:36 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-bugs@FreeBSD.org
Subject:   [Bug 219988] [kernel] sys/kern/kern_sysctl.c:a sleep-under-rmlock bug in sysctl_add_oid
Message-ID:  <bug-219988-8-3RgBntooFq@https.bugs.freebsd.org/bugzilla/>
In-Reply-To: <bug-219988-8@https.bugs.freebsd.org/bugzilla/>
References:  <bug-219988-8@https.bugs.freebsd.org/bugzilla/>

next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D219988

Conrad Meyer <cem@freebsd.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |cem@freebsd.org
            Version|11.0-RELEASE                |CURRENT
           Hardware|i386                        |Any

--- Comment #1 from Conrad Meyer <cem@freebsd.org> ---
I suggest moving the allocation out from under the lock rather than convert=
ing
an M_WAITOK allocation to M_NOWAIT.  E.g.,

--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -698,11 +698,12 @@ sysctl_add_oid(struct sysctl_ctx_list *clist, struct
sysctl_oid_list *parent,
        int (*handler)(SYSCTL_HANDLER_ARGS), const char *fmt, const char
*descr,
        const char *label)
 {
-       struct sysctl_oid *oidp;
+       struct sysctl_oid *oidp, *storage;

        /* You have to hook up somewhere.. */
        if (parent =3D=3D NULL)
                return(NULL);
+       storage =3D malloc(sizeof(*storage), M_SYSCTLOID, M_WAITOK|M_ZERO);
        /* Check if the node already exists, otherwise create it */
        SYSCTL_WLOCK();
        oidp =3D sysctl_find_oidname(name, parent);
@@ -713,14 +714,16 @@ sysctl_add_oid(struct sysctl_ctx_list *clist, struct
sysctl_oid_list *parent,
                        if (clist !=3D NULL)
                                sysctl_ctx_entry_add(clist, oidp);
                        SYSCTL_WUNLOCK();
+                       free(storage);
                        return (oidp);
                } else {
                        SYSCTL_WUNLOCK();
                        printf("can't re-use a leaf (%s)!\n", name);
+                       free(storage);
                        return (NULL);
                }
        }
-       oidp =3D malloc(sizeof(struct sysctl_oid), M_SYSCTLOID, M_WAITOK|M_=
ZERO);
+       oidp =3D storage;
        oidp->oid_parent =3D parent;
        SLIST_INIT(&oidp->oid_children);
        oidp->oid_number =3D number;

--=20
You are receiving this mail because:
You are the assignee for the bug.=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-219988-8-3RgBntooFq>