aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2010-05-03 08:07:53 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2010-05-03 08:07:53 +0000
commitb32d39b75531bb10a9b8062ad45f82e027f67e61 (patch)
treeace806474a5a309b18e01bf979c29b52247e38d3 /epan/dissectors
parent0c6f08e2b2a0b25c3e0b39a4336f0ad3c15b4cde (diff)
ignore unreassembled fragments if the first segment of the next message comes
svn path=/trunk/; revision=32643
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-q931.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/epan/dissectors/packet-q931.c b/epan/dissectors/packet-q931.c
index be88fe7f35..8019c57818 100644
--- a/epan/dissectors/packet-q931.c
+++ b/epan/dissectors/packet-q931.c
@@ -2559,7 +2559,7 @@ dissect_q931_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
guint8 message_type, segmented_message_type;
guint8 info_element;
guint16 info_element_len;
- gboolean more_frags;
+ gboolean first_frag, more_frags;
guint32 frag_len;
fragment_data *fd_head;
tvbuff_t *next_tvb = NULL;
@@ -2641,6 +2641,7 @@ dissect_q931_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
val_to_str(info_element, q931_info_element_vals[0], "Unknown (0x%02X)"));
proto_tree_add_text(ie_tree, tvb, offset + 1, 1, "Length: %u", info_element_len);
dissect_q931_segmented_message_ie(tvb, offset + 2, info_element_len, ie_tree);
+ first_frag = (tvb_get_guint8(tvb, offset + 2) & 0x80) != 0;
more_frags = (tvb_get_guint8(tvb, offset + 2) & 0x7F) != 0;
segmented_message_type = tvb_get_guint8(tvb, offset + 3);
if (check_col(pinfo->cinfo, COL_INFO)) {
@@ -2650,6 +2651,10 @@ dissect_q931_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
offset += 1 + 1 + info_element_len;
/* Reassembly */
frag_len = tvb_reported_length_remaining(tvb, offset);
+ if (first_frag && fragment_get(pinfo, call_ref_val, q931_fragment_table)) {
+ /* there are some unreassembled segments, ignore them */
+ fragment_end_seq_next(pinfo, call_ref_val, q931_fragment_table, q931_reassembled_table);
+ }
fd_head = fragment_add_seq_next(tvb, offset, pinfo, call_ref_val,
q931_fragment_table, q931_reassembled_table,
frag_len, more_frags);