svn commit: r261206 - projects/sendfile/sys/kern

Gleb Smirnoff glebius at FreeBSD.org
Mon Jan 27 07:59:04 UTC 2014


Author: glebius
Date: Mon Jan 27 07:59:04 2014
New Revision: 261206
URL: http://svnweb.freebsd.org/changeset/base/261206

Log:
  Fixes to socket buffer readiness routines:
  
  - Assert buffer lock in sb_shift_nrdy().
  - Handle race with socket shutdown in sbready().
  - Fix sb->sb_acc counting logic error in sbready().
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/sendfile/sys/kern/uipc_sockbuf.c

Modified: projects/sendfile/sys/kern/uipc_sockbuf.c
==============================================================================
--- projects/sendfile/sys/kern/uipc_sockbuf.c	Mon Jan 27 07:53:10 2014	(r261205)
+++ projects/sendfile/sys/kern/uipc_sockbuf.c	Mon Jan 27 07:59:04 2014	(r261206)
@@ -72,6 +72,7 @@ static void
 sb_shift_nrdy(struct sockbuf *sb, struct mbuf *m)
 {
 
+	SOCKBUF_LOCK_ASSERT(sb);
 	KASSERT(m->m_flags & M_NOTREADY, ("%s: m %p !M_NOTREADY", __func__, m));
 
 	m = m->m_next;
@@ -91,6 +92,11 @@ sbready(struct sockbuf *sb, struct mbuf 
 
 	SOCKBUF_LOCK(sb);
 
+	if (sb->sb_state & SBS_CANTSENDMORE) {
+		SOCKBUF_UNLOCK(sb);
+		return (ENOTCONN);
+	}
+
 	KASSERT(sb->sb_fnrdy != NULL, ("%s: sb %p NULL fnrdy", __func__, sb));
 
 	blocker = (sb->sb_fnrdy == m) ? M_BLOCKED : 0;
@@ -99,7 +105,8 @@ sbready(struct sockbuf *sb, struct mbuf 
 		KASSERT(m->m_flags & M_NOTREADY,
 		    ("%s: m %p !M_NOTREADY", __func__, m));
 		m->m_flags &= ~(M_NOTREADY | blocker);
-		sb->sb_acc += m->m_len;
+		if (blocker)
+			sb->sb_acc += m->m_len;
 	}
 
 	if (!blocker) {


More information about the svn-src-projects mailing list