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>