svn commit: r252887 - stable/9/sys/kern

Jilles Tjoelker jilles at FreeBSD.org
Sat Jul 6 14:21:22 UTC 2013


Author: jilles
Date: Sat Jul  6 14:21:22 2013
New Revision: 252887
URL: http://svnweb.freebsd.org/changeset/base/252887

Log:
  MFC r250102: socket: Make shutdown() wake up a blocked accept().
  
  A blocking accept (and some other operations) waits on &so->so_timeo. Once
  it wakes up, it will detect the SBS_CANTRCVMORE bit.
  
  The error from accept() is [ECONNABORTED] which is not the nicest one -- the
  thread calling accept() needs to know out-of-band what is happening.
  
  A spurious wakeup on so->so_timeo appears harmless (sleep retried) except
  when lingering on close (SO_LINGER, and in that case there is no descriptor
  to call shutdown() on) so this should be fairly safe.
  
  A shutdown() already woke up a blocked accept() for TCP sockets, but not for
  Unix domain sockets. This fix is generic for all domains.
  
  This patch was sent to -hackers@ and -net@ on April 5.

Modified:
  stable/9/sys/kern/uipc_socket.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/uipc_socket.c
==============================================================================
--- stable/9/sys/kern/uipc_socket.c	Sat Jul  6 12:56:30 2013	(r252886)
+++ stable/9/sys/kern/uipc_socket.c	Sat Jul  6 14:21:22 2013	(r252887)
@@ -2339,9 +2339,11 @@ soshutdown(struct socket *so, int how)
 		sorflush(so);
 	if (how != SHUT_RD) {
 		error = (*pr->pr_usrreqs->pru_shutdown)(so);
+		wakeup(&so->so_timeo);
 		CURVNET_RESTORE();
 		return (error);
 	}
+	wakeup(&so->so_timeo);
 	CURVNET_RESTORE();
 	return (0);
 }


More information about the svn-src-all mailing list