Date: Tue, 6 Mar 2012 19:43:26 +0000 (UTC) From: Andre Oppermann <andre@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r232617 - user/andre/tcp_workqueue/sys/kern Message-ID: <201203061943.q26JhQ1H054611@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: andre Date: Tue Mar 6 19:43:26 2012 New Revision: 232617 URL: http://svn.freebsd.org/changeset/base/232617 Log: In soreceive_stream() don't drop an already dequeued mbuf chain by overwriting the return mbuf pointer with newly received data after a loop. Instead append the new mbuf chain to the existing one. Fix up sb_lastrecord when dequeuing mbuf's so that sbappend_stream() doesn't get confused. For the remainder copy case in the mbuf delivery part deduct the copied length len instead of the whole mbuf length. Additionally don't depend on 'n' being being available which isn't true in the case of MSG_PEEK. Submitted by: trociny (slightly different version) Modified: user/andre/tcp_workqueue/sys/kern/uipc_socket.c Modified: user/andre/tcp_workqueue/sys/kern/uipc_socket.c ============================================================================== --- user/andre/tcp_workqueue/sys/kern/uipc_socket.c Tue Mar 6 19:19:33 2012 (r232616) +++ user/andre/tcp_workqueue/sys/kern/uipc_socket.c Tue Mar 6 19:43:26 2012 (r232617) @@ -2044,7 +2044,7 @@ deliver: if (mp0 != NULL) { /* Dequeue as many mbufs as possible. */ if (!(flags & MSG_PEEK) && len >= sb->sb_mb->m_len) { - for (*mp0 = m = sb->sb_mb; + for (m = sb->sb_mb; m != NULL && m->m_len <= len; m = m->m_next) { len -= m->m_len; @@ -2052,10 +2052,15 @@ deliver: sbfree(sb, m); n = m; } + n->m_next = NULL; sb->sb_mb = m; + sb->sb_lastrecord = sb->sb_mb; if (sb->sb_mb == NULL) SB_EMPTY_FIXUP(sb); - n->m_next = NULL; + if (*mp0 != NULL) + m_cat(*mp0, m); + else + *mp0 = m; } /* Copy the remainder. */ if (len > 0) { @@ -2066,9 +2071,9 @@ deliver: if (m == NULL) len = 0; /* Don't flush data from sockbuf. */ else - uio->uio_resid -= m->m_len; + uio->uio_resid -= len; if (*mp0 != NULL) - n->m_next = m; + m_cat(*mp0, m); else *mp0 = m; if (*mp0 == NULL) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203061943.q26JhQ1H054611>