Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Mar 2009 23:05:54 +0000 (GMT)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Mike Silbersack <silby@FreeBSD.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   Re: svn commit: r190299 - stable/7/sys/kern
Message-ID:  <alpine.BSF.2.00.0903222305120.85640@fledge.watson.org>
In-Reply-To: <200903222300.n2MN00IO086771@svn.freebsd.org>
References:  <200903222300.n2MN00IO086771@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 22 Mar 2009, Mike Silbersack wrote:

>  Fix unp_gc so that it recognizes file descriptors
>  that are currently in the process of being passed
>  between processes as alive and does not
>  try to garbage collect them.
>
>  The full description of the problem and a test
>  program to reproduce it can be found in PR 112554.
>
>  This fix was inspired by similar fixes in NetBSD and BSD/OS.
>  However, it does not apply to FreeBSD 8 and above -
>  when this code was rewritten and optimized, the bug
>  was fixed in a different way.  The test program in the
>  PR passes on 8-current with flying colors.

We have a UNIX domain socket-passing regression test that creates various 
contortion-esque situations and then looks to see if sockets were leaked.  If 
it doesn't yet capture this failure mode, could you add it to that test?

Robert N M Watson
Computer Laboratory
University of Cambridge

>
>  PR:		112554
>  Submitted by:	Spencer Minear
>  Reviewed by:	Mike Silbersack
>  Obtained from:	Secure Computing Corp
>  MFC after:	4 weeks
>
> Modified:
>  stable/7/sys/kern/uipc_usrreq.c
>
> Modified: stable/7/sys/kern/uipc_usrreq.c
> ==============================================================================
> --- stable/7/sys/kern/uipc_usrreq.c	Sun Mar 22 22:57:53 2009	(r190298)
> +++ stable/7/sys/kern/uipc_usrreq.c	Sun Mar 22 23:00:00 2009	(r190299)
> @@ -1878,6 +1878,7 @@ unp_gc(__unused void *arg, int pending)
> {
> 	struct file *fp, *nextfp;
> 	struct socket *so;
> +	struct socket *soa;
> 	struct file **extra_ref, **fpp;
> 	int nunref, i;
> 	int nfiles_snap;
> @@ -1984,6 +1985,20 @@ unp_gc(__unused void *arg, int pending)
> 			SOCKBUF_UNLOCK(&so->so_rcv);
>
> 			/*
> +			 * If socket is in listening state, then sockets
> +			 * in its accept queue are accessible, and so
> +			 * are any descriptors in those sockets' receive
> +			 * queues.
> +			 */
> +			ACCEPT_LOCK();
> +			TAILQ_FOREACH(soa, &so->so_comp, so_list) {
> +			    SOCKBUF_LOCK(&soa->so_rcv);
> +			    unp_scan(soa->so_rcv.sb_mb, unp_mark);
> +			    SOCKBUF_UNLOCK(&soa->so_rcv);
> +			}
> +			ACCEPT_UNLOCK();
> +
> +			/*
> 			 * Wake up any threads waiting in fdrop().
> 			 */
> 			FILE_LOCK(fp);
>



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