svn commit: r219651 - projects/ofed/head/sys/kern

Jeff Roberson jeff at FreeBSD.org
Mon Mar 14 23:16:58 UTC 2011


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,


More information about the svn-src-projects mailing list