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