[issue1777] vn panic: Freeing already free credential! 0xdef403f8

Joe Talbott josepht at cstone.net
Sat Jun 5 15:14:39 PDT 2010


On Sat, Jun 05, 2010 at 12:26:47PM -0700, Matthew Dillon wrote:
> 
> :The vn structure appears to NOT be corrupt.  Seems like a race if
> :vn->sc_cred goes from NULL to non-NULL between frame 6 and 5.  Could
> :this be related to my recent link_elf change (setting p to proc0 if p
> :is NULL)?
> :
> :Joe
> 
>     Hmm.  If devfs is racing access to that field then try changing the
>     vnsetcred() code around a bit to this:
> 
> 	struct ucred *ocred
> 	...
> 
> 
>         /*
>          * Set credits in our softc
>          */
>         ocred = vn->sc_cred;
>         vn->sc_cred = crdup(cred);
>         if (ocred)
>                 crfree(ocred);
> 
>     If the race is more involved then that (assuming it is a race), we
>     may have to call crhold() and friends whenever we use vn->sc_cred.
> 

Sam,

Please try this patch.  I was able to vnconfig a file following the
vkernel manpage without a panic.  This isn't likely a long term
solution but will hopefully allow you to proceed with your GSoC work
in a vkernel.  If you see this panic again let me know and I'll work
on implementing the crhold() et al. calls as Matt suggested.

Thanks,
Joe
diff --git a/sys/dev/disk/vn/vn.c b/sys/dev/disk/vn/vn.c
index 95bcf44..9f45281 100644
--- a/sys/dev/disk/vn/vn.c
+++ b/sys/dev/disk/vn/vn.c
@@ -697,7 +697,7 @@ vnsetcred(struct vn_softc *vn, struct ucred *cred)
 	 * Set credits in our softc
 	 */
 
-	if (vn->sc_cred)
+	if (vn->sc_cred && vn->sc_cred->cr_ref > 0)
 		crfree(vn->sc_cred);
 	vn->sc_cred = crdup(cred);
 




More information about the Bugs mailing list