From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 23:16:58 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 39A3A10656B4; Mon, 14 Mar 2011 23:16:58 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 29BB28FC0C; Mon, 14 Mar 2011 23:16:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2ENGwKj014574; Mon, 14 Mar 2011 23:16:58 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2ENGwpm014572; Mon, 14 Mar 2011 23:16:58 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103142316.p2ENGwpm014572@svn.freebsd.org> From: Jeff Roberson Date: Mon, 14 Mar 2011 23:16:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219651 - projects/ofed/head/sys/kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2011 23:16:58 -0000 Author: jeff Date: Mon Mar 14 23:16:57 2011 New Revision: 219651 URL: http://svn.freebsd.org/changeset/base/219651 Log: - Use SLIST_FOREACH_SAFE when removing OIDs which will be freed when not using a sysctl context. I don't know how we could've gone this long without running into this bug before. Modified: projects/ofed/head/sys/kern/kern_sysctl.c Modified: projects/ofed/head/sys/kern/kern_sysctl.c ============================================================================== --- projects/ofed/head/sys/kern/kern_sysctl.c Mon Mar 14 23:13:01 2011 (r219650) +++ projects/ofed/head/sys/kern/kern_sysctl.c Mon Mar 14 23:16:57 2011 (r219651) @@ -369,12 +369,12 @@ int sysctl_remove_name(struct sysctl_oid *parent, const char *name, int del, int recurse) { - struct sysctl_oid *p; + struct sysctl_oid *p, *tmp; int error; error = ENOENT; SYSCTL_XLOCK(); - SLIST_FOREACH(p, SYSCTL_CHILDREN(parent), oid_link) { + SLIST_FOREACH_SAFE(p, SYSCTL_CHILDREN(parent), oid_link, tmp) { if (strcmp(p->oid_name, name) == 0) { error = sysctl_remove_oid_locked(p, del, recurse); break; @@ -389,7 +389,7 @@ sysctl_remove_name(struct sysctl_oid *pa static int sysctl_remove_oid_locked(struct sysctl_oid *oidp, int del, int recurse) { - struct sysctl_oid *p; + struct sysctl_oid *p, *tmp; int error; SYSCTL_ASSERT_XLOCKED(); @@ -408,7 +408,8 @@ sysctl_remove_oid_locked(struct sysctl_o */ if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) { if (oidp->oid_refcnt == 1) { - SLIST_FOREACH(p, SYSCTL_CHILDREN(oidp), oid_link) { + SLIST_FOREACH_SAFE(p, + SYSCTL_CHILDREN(oidp), oid_link, tmp) { if (!recurse) return (ENOTEMPTY); error = sysctl_remove_oid_locked(p, del,