Author: tuexen
Date: Thu May 15 20:19:33 2014
New Revision: 266189
URL: http://svnweb.freebsd.org/changeset/base/266189

Log:
  MFC r264704:
  
  Add consistency checks to ensure that fragments of a user message
  have the same U-bit.

Modified:
  stable/9/sys/netinet/sctp_indata.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/netinet/sctp_indata.c
==============================================================================
--- stable/9/sys/netinet/sctp_indata.c  Thu May 15 20:17:20 2014        
(r266188)
+++ stable/9/sys/netinet/sctp_indata.c  Thu May 15 20:19:33 2014        
(r266189)
@@ -828,7 +828,6 @@ sctp_queue_data_for_reasm(struct sctp_tc
 {
        struct mbuf *op_err;
        char msg[SCTP_DIAG_INFO_LEN];
-
        uint32_t cum_ackp1, prev_tsn, post_tsn;
        struct sctp_tmit_chunk *at, *prev, *next;
 
@@ -1017,6 +1016,24 @@ sctp_queue_data_for_reasm(struct sctp_tc
                                        *abort_flag = 1;
                                        return;
                                }
+                               if ((chk->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) !=
+                                   (prev->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED)) {
+                                       /*
+                                        * Huh, need the same ordering here,
+                                        * they must be the same.
+                                        */
+                                       SCTPDBG(SCTP_DEBUG_INDATA1, "Prev check 
- Gak, Evil plot, U-bit not constant\n");
+                                       snprintf(msg, sizeof(msg),
+                                           "Expect U-bit=%d for TSN=%8.8x, got 
U-bit=%d",
+                                           (prev->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) ? 1 : 0,
+                                           chk->rec.data.TSN_seq,
+                                           (chk->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) ? 1 : 0);
+                                       op_err = 
sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
+                                       stcb->sctp_ep->last_abort_code = 
SCTP_FROM_SCTP_INDATA + SCTP_LOC_7;
+                                       
sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
+                                       *abort_flag = 1;
+                                       return;
+                               }
                                if ((prev->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) == 0 &&
                                    chk->rec.data.stream_seq !=
                                    prev->rec.data.stream_seq) {
@@ -1127,6 +1144,24 @@ sctp_queue_data_for_reasm(struct sctp_tc
                                        *abort_flag = 1;
                                        return;
                                }
+                               if ((chk->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) !=
+                                   (next->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED)) {
+                                       /*
+                                        * Huh, need the same ordering here,
+                                        * they must be the same.
+                                        */
+                                       SCTPDBG(SCTP_DEBUG_INDATA1, "Next check 
- Gak, Evil plot, U-bit not constant\n");
+                                       snprintf(msg, sizeof(msg),
+                                           "Expect U-bit=%d for TSN=%8.8x, got 
U-bit=%d",
+                                           (next->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) ? 1 : 0,
+                                           chk->rec.data.TSN_seq,
+                                           (chk->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) ? 1 : 0);
+                                       op_err = 
sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
+                                       stcb->sctp_ep->last_abort_code = 
SCTP_FROM_SCTP_INDATA + SCTP_LOC_12;
+                                       
sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
+                                       *abort_flag = 1;
+                                       return;
+                               }
                                if ((next->rec.data.rcv_flags & 
SCTP_DATA_UNORDERED) == 0 &&
                                    chk->rec.data.stream_seq !=
                                    next->rec.data.stream_seq) {
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to