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>
