aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/rtse
diff options
context:
space:
mode:
authorGraeme Lunt <graeme.lunt@smhs.co.uk>2007-06-27 17:57:44 +0000
committerGraeme Lunt <graeme.lunt@smhs.co.uk>2007-06-27 17:57:44 +0000
commit1763f7caa3478bae9771c6c78fd4349544ea6df5 (patch)
tree28443b36537f7fb52142b6e82085c09b273bd41a /asn1/rtse
parent473077719e547110d32fc61ef0bc9e5bacdc4924 (diff)
This patch adds a check for octet string in RTSE reassembly.
If not an octet string the data is handled as ordinary RTSE APDU. svn path=/trunk/; revision=22208
Diffstat (limited to 'asn1/rtse')
-rw-r--r--asn1/rtse/packet-rtse-template.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/asn1/rtse/packet-rtse-template.c b/asn1/rtse/packet-rtse-template.c
index b40ce44605..765e335b46 100644
--- a/asn1/rtse/packet-rtse-template.c
+++ b/asn1/rtse/packet-rtse-template.c
@@ -177,6 +177,7 @@ dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
fragment_data *frag_msg = NULL;
guint32 fragment_length;
guint32 rtse_id = 0;
+ gboolean data_handled = FALSE;
conversation_t *conversation = NULL;
asn1_ctx_t asn1_ctx;
asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
@@ -220,7 +221,7 @@ dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
frag_msg, &rtse_frag_items, NULL, parent_tree);
}
if(parent_tree){
- item = proto_tree_add_item(parent_tree, proto_rtse, tvb, 0, -1, FALSE);
+ item = proto_tree_add_item(parent_tree, proto_rtse, next_tvb ? next_tvb : tvb, 0, -1, FALSE);
tree = proto_item_add_subtree(item, ett_rtse);
}
if (rtse_reassemble && session->spdu_type == SES_DATA_TRANSFER) {
@@ -228,22 +229,24 @@ dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
col_append_fstr(pinfo->cinfo, COL_INFO, "[RTSE Fragment]");
/* strip off the OCTET STRING encoding - including any CONSTRUCTED OCTET STRING */
- offset = dissect_ber_octet_string(FALSE, &asn1_ctx, NULL, tvb, offset, 0, &data_tvb);
-
-
- fragment_length = tvb_length_remaining (data_tvb, 0);
- proto_tree_add_text(tree, data_tvb, 0, (fragment_length) ? -1 : 0,
- "RTSE segment data (%u byte%s)", fragment_length,
- plurality(fragment_length, "", "s"));
- frag_msg = fragment_add_seq_next (data_tvb, 0, pinfo,
- rtse_id, rtse_segment_table,
- rtse_reassembled_table, fragment_length, TRUE);
- if (frag_msg && pinfo->fd->num != frag_msg->reassembled_in) {
- /* Add a "Reassembled in" link if not reassembled in this frame */
- proto_tree_add_uint (tree, *(rtse_frag_items.hf_reassembled_in),
- data_tvb, 0, 0, frag_msg->reassembled_in);
+ dissect_ber_octet_string(FALSE, &asn1_ctx, NULL, tvb, offset, 0, &data_tvb);
+
+ if (data_tvb) {
+ fragment_length = tvb_length_remaining (data_tvb, 0);
+ proto_tree_add_text(tree, data_tvb, 0, (fragment_length) ? -1 : 0,
+ "RTSE segment data (%u byte%s)", fragment_length,
+ plurality(fragment_length, "", "s"));
+ frag_msg = fragment_add_seq_next (data_tvb, 0, pinfo,
+ rtse_id, rtse_segment_table,
+ rtse_reassembled_table, fragment_length, TRUE);
+ if (frag_msg && pinfo->fd->num != frag_msg->reassembled_in) {
+ /* Add a "Reassembled in" link if not reassembled in this frame */
+ proto_tree_add_uint (tree, *(rtse_frag_items.hf_reassembled_in),
+ data_tvb, 0, 0, frag_msg->reassembled_in);
+ }
+ pinfo->fragmented = TRUE;
+ data_handled = TRUE;
}
- pinfo->fragmented = TRUE;
} else if (rtse_reassemble && session->spdu_type == SES_MAJOR_SYNC_POINT) {
if (next_tvb) {
/* ROS won't do this for us */
@@ -253,7 +256,10 @@ dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
offset = tvb_length (tvb);
}
pinfo->fragmented = FALSE;
- } else {
+ data_handled = TRUE;
+ }
+
+ if (!data_handled) {
while (tvb_reported_length_remaining(tvb, offset) > 0){
old_offset=offset;
offset=dissect_rtse_RTSE_apdus(TRUE, tvb, offset, &asn1_ctx, tree, -1);