Skip site navigation (1)Skip section navigation (2)
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>