Skip site navigation (1)Skip section navigation (2)
Date:      Mon,  5 Mar 2001 01:38:40 -0800 (PST)
From:      hsu@FreeBSD.ORG (Jeffrey Hsu)
To:        alfred@FreeBSD.ORG, bmilekic@FreeBSD.ORG, freebsd-audit@FreeBSD.ORG
Subject:   protecting cr_ref and ui_ref in -stable
Message-ID:  <20010305093840.3BAE837B718@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Is something like the following needed in -stable?  -current protects
these structures with a mutex and I've had panics in -stable from bad
reference counts.

Index: sys/resourcevar.h
===================================================================
RCS file: /home/cvs/FreeBSD/src/sys/sys/resourcevar.h,v
retrieving revision 1.16.2.1
diff -u -r1.16.2.1 resourcevar.h
--- sys/resourcevar.h	2000/09/07 19:13:55	1.16.2.1
+++ sys/resourcevar.h	2001/03/05 09:28:17
@@ -93,7 +93,12 @@
 };
 
 #ifdef _KERNEL
-#define uihold(uip)	(uip)->ui_ref++
+#define uihold(uip) do {						\
+	int s = splnet();						\
+	(uip)->ui_ref++;						\
+	splx(s);							\
+} while(0)
+
 struct proc;
 
 void	 addupc_intr __P((struct proc *p, u_long pc, u_int ticks));
Index: sys/ucred.h
===================================================================
RCS file: /home/cvs/FreeBSD/src/sys/sys/ucred.h,v
retrieving revision 1.14.2.3
diff -u -r1.14.2.3 ucred.h
--- sys/ucred.h	2000/10/28 02:10:30	1.14.2.3
+++ sys/ucred.h	2001/03/05 09:26:27
@@ -55,7 +55,11 @@
 #define FSCRED ((struct ucred *)-1)	/* filesystem credential */
 
 #ifdef _KERNEL
-#define	crhold(cr)	(cr)->cr_ref++
+#define	crhold(cr) do {							\
+	int s = splnet();						\
+	(cr)->cr_ref++;							\
+	splx(s);							\
+} while (0)
 
 struct proc;
 
Index: kern/kern_prot.c
===================================================================
RCS file: /home/cvs/FreeBSD/src/sys/kern/kern_prot.c,v
retrieving revision 1.53.2.6
diff -u -r1.53.2.6 kern_prot.c
--- kern/kern_prot.c	2000/12/09 02:44:47	1.53.2.6
+++ kern/kern_prot.c	2001/03/05 09:32:33
@@ -998,6 +998,9 @@
 crfree(cr)
 	struct ucred *cr;
 {
+	int s;
+
+	s = splnet();
 	if (--cr->cr_ref == 0) {
 		/*
 		 * Some callers of crget(), such as nfs_statfs(),
@@ -1008,6 +1011,7 @@
 			uifree(cr->cr_uidinfo);
 		FREE((caddr_t)cr, M_CRED);
 	}
+	splx(s);
 }
 
 /*
@@ -1018,9 +1022,15 @@
 	struct ucred *cr;
 {
 	struct ucred *newcr;
+	int s;
+
 
-	if (cr->cr_ref == 1)
+	s = splnet();
+	if (cr->cr_ref == 1) {
+		splx(s);
 		return (cr);
+	}
+	splx(s);
 	newcr = crget();
 	*newcr = *cr;
 	uihold(newcr->cr_uidinfo);
Index: kern/kern_resource.c
===================================================================
RCS file: /home/cvs/FreeBSD/src/sys/kern/kern_resource.c,v
retrieving revision 1.55.2.4
diff -u -r1.55.2.4 kern_resource.c
--- kern/kern_resource.c	2001/03/02 17:12:35	1.55.2.4
+++ kern/kern_resource.c	2001/03/05 09:29:35
@@ -718,11 +718,14 @@
 	uid_t uid;
 {
 	struct	uidinfo *uip;
+	int	s;
 
 	uip = uilookup(uid);
 	if (uip == NULL)
 		uip = uicreate(uid);
+	s = splnet();
 	uip->ui_ref++;
+	splx(s);
 	return (uip);
 }
 
@@ -731,7 +734,11 @@
 	struct	uidinfo *uip;
 {
 
+	int	s;
+
+	s = splnet();
 	if (--uip->ui_ref == 0) {
+		splx(s);
 		if (uip->ui_sbsize != 0)
 			/* XXX no %qd in kernel.  Truncate. */
 			printf("freeing uidinfo: uid = %d, sbsize = %ld\n",
@@ -743,6 +750,7 @@
 		FREE(uip, M_UIDINFO);
 		return (1);
 	}
+	splx(s);
 	return (0);
 }
 

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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010305093840.3BAE837B718>