svn commit: r206729 - stable/8/sys/netinet

Randall Stewart rrs at FreeBSD.org
Sat Apr 17 03:51:13 UTC 2010


Author: rrs
Date: Sat Apr 17 03:51:13 2010
New Revision: 206729
URL: http://svn.freebsd.org/changeset/base/206729

Log:
  MFC of  202523
  
  This fixes a closing race condition that is unlikely
  to ever happen.. but good to fix ;-)

Modified:
  stable/8/sys/netinet/sctp_usrreq.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/netinet/sctp_usrreq.c
==============================================================================
--- stable/8/sys/netinet/sctp_usrreq.c	Sat Apr 17 03:49:21 2010	(r206728)
+++ stable/8/sys/netinet/sctp_usrreq.c	Sat Apr 17 03:51:13 2010	(r206729)
@@ -551,6 +551,7 @@ sctp_attach(struct socket *so, int proto
 	sctp_log_closing(inp, NULL, 17);
 #endif
 	if (error != 0) {
+try_again:
 		flags = inp->sctp_flags;
 		if (((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) &&
 		    (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) {
@@ -561,7 +562,12 @@ sctp_attach(struct socket *so, int proto
 			sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT,
 			    SCTP_CALLED_AFTER_CMPSET_OFCLOSE);
 		} else {
-			SCTP_INP_WUNLOCK(inp);
+			flags = inp->sctp_flags;
+			if ((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
+				goto try_again;
+			} else {
+				SCTP_INP_WUNLOCK(inp);
+			}
 		}
 		return error;
 	}


More information about the svn-src-all mailing list