Author: andre
Date: Fri Jul  5 14:18:09 2013
New Revision: 252785
URL: http://svnweb.freebsd.org/changeset/base/252785

Log:
  MFC r242309:
  
   Fix a couple of soreceive_stream() issues.
  
   Submitted by:        trociny

Modified:
  stable/9/sys/kern/uipc_socket.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/uipc_socket.c
==============================================================================
--- stable/9/sys/kern/uipc_socket.c     Fri Jul  5 14:16:04 2013        
(r252784)
+++ stable/9/sys/kern/uipc_socket.c     Fri Jul  5 14:18:09 2013        
(r252785)
@@ -1948,6 +1948,7 @@ release:
 
 /*
  * Optimized version of soreceive() for stream (TCP) sockets.
+ * XXXAO: (MSG_WAITALL | MSG_PEEK) isn't properly handled.
  */
 int
 soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
@@ -2036,7 +2037,7 @@ restart:
 
        /* On MSG_WAITALL we must wait until all data or error arrives. */
        if ((flags & MSG_WAITALL) &&
-           (sb->sb_cc >= uio->uio_resid || sb->sb_cc >= sb->sb_lowat))
+           (sb->sb_cc >= uio->uio_resid || sb->sb_cc >= sb->sb_hiwat))
                goto deliver;
 
        /*
@@ -2062,7 +2063,11 @@ 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;
+                       if (*mp0 == NULL)
+                               *mp0 = sb->sb_mb;
+                       else
+                               m_cat(*mp0, sb->sb_mb);
+                       for (m = sb->sb_mb;
                             m != NULL && m->m_len <= len;
                             m = m->m_next) {
                                len -= m->m_len;
@@ -2070,10 +2075,11 @@ 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;
                }
                /* Copy the remainder. */
                if (len > 0) {
@@ -2084,9 +2090,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) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to