Author: emax
Date: Mon May  4 20:48:07 2009
New Revision: 191796
URL: http://svn.freebsd.org/changeset/base/191796

Log:
  MFC r191366
  
  Fix sbappendrecord_locked().
  
  The main problem is that sbappendrecord_locked() relies on sbcompress()
  to set sb_mbtail. This will not happen if sbappendrecord_locked() is
  called with mbuf chain made of exactly one mbuf (i.e. m0->m_next == NULL).
  In this case sbcompress() will be called with m == NULL and will do
  nothing. I'm not entirely sure if m == NULL is a valid argument for
  sbcompress(), and, it rather pointless to call it like that, but keep
  calling it so it can do SBLASTMBUFCHK().
  
  PR:                   kern/126742
  Investigated by:      pluknet < pluknet -at- gmail -dot- com >
  No response from:     freebsd-current@, freebsd-bluetooth@

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/kern/uipc_sockbuf.c

Modified: stable/7/sys/kern/uipc_sockbuf.c
==============================================================================
--- stable/7/sys/kern/uipc_sockbuf.c    Mon May  4 20:35:59 2009        
(r191795)
+++ stable/7/sys/kern/uipc_sockbuf.c    Mon May  4 20:48:07 2009        
(r191796)
@@ -576,10 +576,6 @@ sbappendrecord_locked(struct sockbuf *sb
 
        if (m0 == 0)
                return;
-       m = sb->sb_mb;
-       if (m)
-               while (m->m_nextpkt)
-                       m = m->m_nextpkt;
        /*
         * Put the first mbuf on the queue.  Note this permits zero length
         * records.
@@ -587,16 +583,14 @@ sbappendrecord_locked(struct sockbuf *sb
        sballoc(sb, m0);
        SBLASTRECORDCHK(sb);
        SBLINKRECORD(sb, m0);
-       if (m)
-               m->m_nextpkt = m0;
-       else
-               sb->sb_mb = m0;
+       sb->sb_mbtail = m0;
        m = m0->m_next;
        m0->m_next = 0;
        if (m && (m0->m_flags & M_EOR)) {
                m0->m_flags &= ~M_EOR;
                m->m_flags |= M_EOR;
        }
+       /* always call sbcompress() so it can do SBLASTMBUFCHK() */
        sbcompress(sb, m, m0);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to