From walter schmid:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 5 Feb 2012 16:19:21 +0000 (16:19 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 5 Feb 2012 16:19:21 +0000 (16:19 +0000)
wrong reassemble of T30 msg if more data fields in T38 packet.

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6790

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@40872 f5534014-38df-0310-8fa8-9805f1628bb7

asn1/t38/packet-t38-template.c
asn1/t38/packet-t38-template.h
asn1/t38/t38.cnf
epan/dissectors/packet-t38.c
epan/dissectors/packet-t38.h

index ed91180cd4ac428cc9a7ccddbc070c292be46533..bf0eed7a25e3a5b7a6bea2465a0c7133661eb05c 100644 (file)
@@ -458,6 +458,8 @@ init_t38_info_conv(packet_info *pinfo)
                        p_t38_conv->src_t38_info.packet_lost = 0;
                        p_t38_conv->src_t38_info.burst_lost = 0;
                        p_t38_conv->src_t38_info.time_first_t4_data = 0;
+                       p_t38_conv->src_t38_info.additional_hdlc_data_field_counter = 0;
+                       p_t38_conv->src_t38_info.seqnum_prev_data_field = -1;
 
                        p_t38_conv->dst_t38_info.reass_ID = 0;
                        p_t38_conv->dst_t38_info.reass_start_seqnum = -1;
@@ -466,6 +468,8 @@ init_t38_info_conv(packet_info *pinfo)
                        p_t38_conv->dst_t38_info.packet_lost = 0;
                        p_t38_conv->dst_t38_info.burst_lost = 0;
                        p_t38_conv->dst_t38_info.time_first_t4_data = 0;
+                       p_t38_conv->dst_t38_info.additional_hdlc_data_field_counter = 0;
+                       p_t38_conv->dst_t38_info.seqnum_prev_data_field = -1;
 
                        conversation_add_proto_data(p_conv, proto_t38, p_t38_conv);
                }
index ea7ea3d82943c60aa6599db459f6bfbb00f4824c..f52a311c4fa22e7610fafc504c911cc601659b8d 100644 (file)
@@ -49,6 +49,7 @@ typedef struct _t38_packet_info {
 /* Info to save the State to reassemble Data (e.g. HDLC) and the Setup (e.g. SDP) in T38 conversations */
 typedef struct _t38_conv_info
 {
+       
        guint32 reass_ID;
        int reass_start_seqnum;
        guint32 reass_data_type;
@@ -56,6 +57,9 @@ typedef struct _t38_conv_info
        guint32 packet_lost;
        guint32 burst_lost;
        double time_first_t4_data; 
+       guint32 additional_hdlc_data_field_counter;
+       gint32 seqnum_prev_data_field;
+       
 } t38_conv_info;
 
 /* Info to save the State to reassemble Data (e.g. HDLC) and the Setup (e.g. SDP) in T38 conversations */
index 767d6528a2fa1a8c920feb9219102fa437def18c..bb101a8e97eb51a745ac8d6ba58991d4e6d56ee4 100644 (file)
@@ -82,7 +82,7 @@ VAL_PTR=&Data_Field_field_type_value
                 frag_msg = fragment_add_seq(tvb, offset, actx->pinfo,
                     p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */
                     data_fragment_table, /* list of message fragments */
-                    seq_number + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_seqnum,  /* fragment sequence number */
+                    seq_number + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter,  /* fragment sequence number */
                     /*0,*/
                     0, /* fragment length */
                     FALSE); /* More fragments */
@@ -143,6 +143,8 @@ VAL_PTR=&Data_Field_field_type_value
         if ( p_t38_conv && ( ((Data_Field_field_type_value >0) && (Data_Field_field_type_value <6)) || (Data_Field_field_type_value == 7) ) ){
             p_t38_conv_info->reass_ID = 0;
             p_t38_conv_info->reass_start_seqnum = -1;
+            p_t38_conv_info->additional_hdlc_data_field_counter = 0;
+            p_t38_conv_info->seqnum_prev_data_field = -1;
         }
         t38_info->Data_Field_field_type_value = Data_Field_field_type_value;
     }
@@ -186,24 +188,34 @@ VAL_PTR=&Data_Field_field_type_value
                     p_t38_conv_info->reass_ID = actx->pinfo->fd->num;
                     p_t38_conv_info->reass_start_seqnum = seq_number;
                     p_t38_conv_info->time_first_t4_data = nstime_to_sec(&actx->pinfo->fd->rel_ts);
+                    p_t38_conv_info->additional_hdlc_data_field_counter = 0;
                     p_t38_packet_conv_info->reass_ID = p_t38_conv_info->reass_ID;
                     p_t38_packet_conv_info->reass_start_seqnum = p_t38_conv_info->reass_start_seqnum;
+                    p_t38_packet_conv_info->seqnum_prev_data_field = p_t38_conv_info->seqnum_prev_data_field;
+                    p_t38_packet_conv_info->additional_hdlc_data_field_counter = p_t38_conv_info->additional_hdlc_data_field_counter;
                     p_t38_packet_conv_info->time_first_t4_data = p_t38_conv_info->time_first_t4_data;
             }
-
+            if (seq_number == (guint32)p_t38_packet_conv_info->seqnum_prev_data_field){
+                  p_t38_packet_conv_info->additional_hdlc_data_field_counter ++;
+                   if(p_t38_conv){
+                     p_t38_conv_info->additional_hdlc_data_field_counter =  p_t38_packet_conv_info->additional_hdlc_data_field_counter;
+                   }
+           }
             frag_msg = fragment_add_seq(value_tvb, 0, actx->pinfo,
                 p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */
                 data_fragment_table, /* list of message fragments */
-                seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum, /* fragment sequence number */
+                seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter, /* fragment sequence number */
                 value_len, /* fragment length */
                 TRUE); /* More fragments */
-
+            p_t38_packet_conv_info->seqnum_prev_data_field = (gint32)seq_number;
             process_reassembled_data(tvb, offset, actx->pinfo,
                         "Reassembled T38", frag_msg, &data_frag_items, NULL, tree);
 
             if (!frag_msg) { /* Not last packet of reassembled */
                 if (Data_Field_field_type_value == 0) {
-                    col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
+                    col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", 
+                                                                     seq_number + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter 
+                                                                       - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
                 } else {
                     col_append_fstr(actx->pinfo->cinfo, COL_INFO," (t4-data fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
                 }
index 627de93e2d02e8e64b005617fa19ba6bc1cb424d..a774b5d4bbd63225fa831bf247d62fb4d66fb083 100644 (file)
@@ -598,7 +598,7 @@ dissect_t38_T_field_type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
                 frag_msg = fragment_add_seq(tvb, offset, actx->pinfo,
                     p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */
                     data_fragment_table, /* list of message fragments */
-                    seq_number + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_seqnum,  /* fragment sequence number */
+                    seq_number + Data_Field_item_num - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter,  /* fragment sequence number */
                     /*0,*/
                     0, /* fragment length */
                     FALSE); /* More fragments */
@@ -659,6 +659,8 @@ dissect_t38_T_field_type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
         if ( p_t38_conv && ( ((Data_Field_field_type_value >0) && (Data_Field_field_type_value <6)) || (Data_Field_field_type_value == 7) ) ){
             p_t38_conv_info->reass_ID = 0;
             p_t38_conv_info->reass_start_seqnum = -1;
+            p_t38_conv_info->additional_hdlc_data_field_counter = 0;
+            p_t38_conv_info->seqnum_prev_data_field = -1;
         }
         t38_info->Data_Field_field_type_value = Data_Field_field_type_value;
     }
@@ -670,7 +672,7 @@ dissect_t38_T_field_type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
 
 static int
 dissect_t38_T_field_data(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 152 "../../asn1/t38/t38.cnf"
+#line 154 "../../asn1/t38/t38.cnf"
     tvbuff_t *value_tvb = NULL;
     guint32 value_len;
 
@@ -681,7 +683,7 @@ dissect_t38_T_field_data(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
 
 
 
-#line 159 "../../asn1/t38/t38.cnf"
+#line 161 "../../asn1/t38/t38.cnf"
     if (primary_part){
         if(value_len < 8){
             col_append_fstr(actx->pinfo->cinfo, COL_INFO, "[%s]",
@@ -712,24 +714,34 @@ dissect_t38_T_field_data(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
                     p_t38_conv_info->reass_ID = actx->pinfo->fd->num;
                     p_t38_conv_info->reass_start_seqnum = seq_number;
                     p_t38_conv_info->time_first_t4_data = nstime_to_sec(&actx->pinfo->fd->rel_ts);
+                    p_t38_conv_info->additional_hdlc_data_field_counter = 0;
                     p_t38_packet_conv_info->reass_ID = p_t38_conv_info->reass_ID;
                     p_t38_packet_conv_info->reass_start_seqnum = p_t38_conv_info->reass_start_seqnum;
+                    p_t38_packet_conv_info->seqnum_prev_data_field = p_t38_conv_info->seqnum_prev_data_field;
+                    p_t38_packet_conv_info->additional_hdlc_data_field_counter = p_t38_conv_info->additional_hdlc_data_field_counter;
                     p_t38_packet_conv_info->time_first_t4_data = p_t38_conv_info->time_first_t4_data;
             }
-
+            if (seq_number == (guint32)p_t38_packet_conv_info->seqnum_prev_data_field){
+                  p_t38_packet_conv_info->additional_hdlc_data_field_counter ++;
+                   if(p_t38_conv){
+                     p_t38_conv_info->additional_hdlc_data_field_counter =  p_t38_packet_conv_info->additional_hdlc_data_field_counter;
+                   }
+           }
             frag_msg = fragment_add_seq(value_tvb, 0, actx->pinfo,
                 p_t38_packet_conv_info->reass_ID, /* ID for fragments belonging together */
                 data_fragment_table, /* list of message fragments */
-                seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum, /* fragment sequence number */
+                seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter, /* fragment sequence number */
                 value_len, /* fragment length */
                 TRUE); /* More fragments */
-
+            p_t38_packet_conv_info->seqnum_prev_data_field = (gint32)seq_number;
             process_reassembled_data(tvb, offset, actx->pinfo,
                         "Reassembled T38", frag_msg, &data_frag_items, NULL, tree);
 
             if (!frag_msg) { /* Not last packet of reassembled */
                 if (Data_Field_field_type_value == 0) {
-                    col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
+                    col_append_fstr(actx->pinfo->cinfo, COL_INFO," (HDLC fragment %u)", 
+                                                                     seq_number + (guint32)p_t38_packet_conv_info->additional_hdlc_data_field_counter 
+                                                                       - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
                 } else {
                     col_append_fstr(actx->pinfo->cinfo, COL_INFO," (t4-data fragment %u)", seq_number - (guint32)p_t38_packet_conv_info->reass_start_seqnum);
                 }
@@ -796,7 +808,7 @@ dissect_t38_T_seq_number(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
   offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
                                                             0U, 65535U, &seq_number, FALSE);
 
-#line 226 "../../asn1/t38/t38.cnf"
+#line 238 "../../asn1/t38/t38.cnf"
     /* info for tap */
     if (primary_part)
         t38_info->seq_num = seq_number;
@@ -810,12 +822,12 @@ dissect_t38_T_seq_number(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_
 
 static int
 dissect_t38_T_primary_ifp_packet(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 234 "../../asn1/t38/t38.cnf"
+#line 246 "../../asn1/t38/t38.cnf"
     primary_part = TRUE;
 
   offset = dissect_per_open_type(tvb, offset, actx, tree, hf_index, dissect_t38_IFPPacket);
 
-#line 236 "../../asn1/t38/t38.cnf"
+#line 248 "../../asn1/t38/t38.cnf"
     /* if is a valid t38 packet, add to tap */
     if (p_t38_packet_conv && (!actx->pinfo->flags.in_error_pkt) && ((gint32) seq_number != p_t38_packet_conv_info->last_seqnum))
         tap_queue_packet(t38_tap, actx->pinfo, t38_info);
@@ -909,14 +921,14 @@ static const per_choice_t T_error_recovery_choice[] = {
 
 static int
 dissect_t38_T_error_recovery(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 244 "../../asn1/t38/t38.cnf"
+#line 256 "../../asn1/t38/t38.cnf"
     primary_part = FALSE;
 
   offset = dissect_per_choice(tvb, offset, actx, tree, hf_index,
                                  ett_t38_T_error_recovery, T_error_recovery_choice,
                                  NULL);
 
-#line 246 "../../asn1/t38/t38.cnf"
+#line 258 "../../asn1/t38/t38.cnf"
     primary_part = TRUE;
 
   return offset;
@@ -932,7 +944,7 @@ static const per_sequence_t UDPTLPacket_sequence[] = {
 
 static int
 dissect_t38_UDPTLPacket(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 220 "../../asn1/t38/t38.cnf"
+#line 232 "../../asn1/t38/t38.cnf"
     /* Initialize to something else than data type */
     Data_Field_field_type_value = 1;
 
@@ -1031,6 +1043,8 @@ init_t38_info_conv(packet_info *pinfo)
                        p_t38_conv->src_t38_info.packet_lost = 0;
                        p_t38_conv->src_t38_info.burst_lost = 0;
                        p_t38_conv->src_t38_info.time_first_t4_data = 0;
+                       p_t38_conv->src_t38_info.additional_hdlc_data_field_counter = 0;
+                       p_t38_conv->src_t38_info.seqnum_prev_data_field = -1;
 
                        p_t38_conv->dst_t38_info.reass_ID = 0;
                        p_t38_conv->dst_t38_info.reass_start_seqnum = -1;
@@ -1039,6 +1053,8 @@ init_t38_info_conv(packet_info *pinfo)
                        p_t38_conv->dst_t38_info.packet_lost = 0;
                        p_t38_conv->dst_t38_info.burst_lost = 0;
                        p_t38_conv->dst_t38_info.time_first_t4_data = 0;
+                       p_t38_conv->dst_t38_info.additional_hdlc_data_field_counter = 0;
+                       p_t38_conv->dst_t38_info.seqnum_prev_data_field = -1;
 
                        conversation_add_proto_data(p_conv, proto_t38, p_t38_conv);
                }
@@ -1315,7 +1331,7 @@ proto_register_t38(void)
         "OCTET_STRING", HFILL }},
 
 /*--- End of included file: packet-t38-hfarr.c ---*/
-#line 669 "../../asn1/t38/packet-t38-template.c"
+#line 673 "../../asn1/t38/packet-t38-template.c"
                {   &hf_t38_setup,
                    { "Stream setup", "t38.setup", FT_STRING, BASE_NONE,
                    NULL, 0x0, "Stream setup, method and frame number", HFILL }},
@@ -1376,7 +1392,7 @@ proto_register_t38(void)
     &ett_t38_T_fec_data,
 
 /*--- End of included file: packet-t38-ettarr.c ---*/
-#line 716 "../../asn1/t38/packet-t38-template.c"
+#line 720 "../../asn1/t38/packet-t38-template.c"
                &ett_t38_setup,
                &ett_data_fragment,
                &ett_data_fragments
index 11684b8d7d01a60ddc09c3be88bc7c852495d127..9d88efb54b96f081184fea6271f2cba0c9080d00 100644 (file)
@@ -57,6 +57,7 @@ typedef struct _t38_packet_info {
 /* Info to save the State to reassemble Data (e.g. HDLC) and the Setup (e.g. SDP) in T38 conversations */
 typedef struct _t38_conv_info
 {
+       
        guint32 reass_ID;
        int reass_start_seqnum;
        guint32 reass_data_type;
@@ -64,6 +65,9 @@ typedef struct _t38_conv_info
        guint32 packet_lost;
        guint32 burst_lost;
        double time_first_t4_data; 
+       guint32 additional_hdlc_data_field_counter;
+       gint32 seqnum_prev_data_field;
+       
 } t38_conv_info;
 
 /* Info to save the State to reassemble Data (e.g. HDLC) and the Setup (e.g. SDP) in T38 conversations */
@@ -89,7 +93,7 @@ WS_VAR_IMPORT const value_string t38_T30_indicator_vals[];
 WS_VAR_IMPORT const value_string t38_T30_data_vals[];
 
 /*--- End of included file: packet-t38-exp.h ---*/
-#line 78 "../../asn1/t38/packet-t38-template.h"
+#line 82 "../../asn1/t38/packet-t38-template.h"