aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2007-03-06 21:03:27 +0000
committerAnders Broman <anders.broman@ericsson.com>2007-03-06 21:03:27 +0000
commitecbf96d04e047c8cce0fb77b295e2e65723b5351 (patch)
treeda4954f8d4cd0095c824958b3bfcea93fcfe5301 /epan
parentfd3a3c5d528cbc96fe1fd4d368f55d96d7e71812 (diff)
From Stig Bjørlykke:
When dumping elements in a constructor in dissect_unknown_ber the last element is not put in the correct subtree, because the while- loop does not include the header length when checking for the end. svn path=/trunk/; revision=20984
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-ber.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/epan/dissectors/packet-ber.c b/epan/dissectors/packet-ber.c
index 41dca13361..a417db8e25 100644
--- a/epan/dissectors/packet-ber.c
+++ b/epan/dissectors/packet-ber.c
@@ -333,6 +333,7 @@ int dissect_unknown_ber(packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tre
gboolean pc, ind;
gint32 tag;
guint32 len;
+ int hdr_len;
proto_item *item=NULL;
proto_tree *next_tree=NULL;
guint8 c;
@@ -497,13 +498,15 @@ int dissect_unknown_ber(packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tre
offset=dissect_ber_length(pinfo, tree, tvb, offset, &len, NULL);
}
+ hdr_len=offset-start_offset;
+
switch(class) {
case BER_CLASS_UNI:
item=proto_tree_add_text(tree, tvb, offset, len, "%s", val_to_str(tag,ber_uni_tag_codes,"Unknown"));
if(item){
next_tree=proto_item_add_subtree(item, ett_ber_SEQUENCE);
}
- while(offset < (int)(start_offset + len))
+ while(offset < (int)(start_offset + len + hdr_len))
offset=dissect_unknown_ber(pinfo, tvb, offset, next_tree);
break;
case BER_CLASS_APP:
@@ -514,7 +517,7 @@ int dissect_unknown_ber(packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tre
if(item){
next_tree=proto_item_add_subtree(item, ett_ber_SEQUENCE);
}
- while(offset < (int)(start_offset + len))
+ while(offset < (int)(start_offset + len + hdr_len))
offset=dissect_unknown_ber(pinfo, tvb, offset, next_tree);
break;