Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Mar 2009 23:00:00 +0000 (UTC)
From:      Mike Silbersack <silby@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r190299 - stable/7/sys/kern
Message-ID:  <200903222300.n2MN00IO086771@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: silby
Date: Sun Mar 22 23:00:00 2009
New Revision: 190299
URL: http://svn.freebsd.org/changeset/base/190299

Log:
  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.
  
  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?200903222300.n2MN00IO086771>