aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-cfm.c
diff options
context:
space:
mode:
authorsake <sake@f5534014-38df-0310-8fa8-9805f1628bb7>2007-11-21 20:33:50 +0000
committersake <sake@f5534014-38df-0310-8fa8-9805f1628bb7>2007-11-21 20:33:50 +0000
commitecf28cd20c13e68ae4987250b06fbd54408602ad (patch)
treebff6bdae8f03747c2d268b3ce52c67fe23ddf68a /epan/dissectors/packet-cfm.c
parent9d25f83ef400deb107d861c02535a41c2037bee7 (diff)
Bug 1994: From Keith Mercer :
This bugfix is focused only in the Sender ID TLV segment of code. This was to address the possibility that the Sender ID TLV may not have a Management Address Domain, and/or a Management Address. This bug was discovered when testing the dissector using CFM-enabled Netopia modems. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@23534 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-cfm.c')
-rw-r--r--epan/dissectors/packet-cfm.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/epan/dissectors/packet-cfm.c b/epan/dissectors/packet-cfm.c
index 6885db3f5e..a27ecef898 100644
--- a/epan/dissectors/packet-cfm.c
+++ b/epan/dissectors/packet-cfm.c
@@ -1624,24 +1624,33 @@ static void dissect_cfm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
tlv_data_offset += tlv_chassis_id_length;
}
- proto_tree_add_item(cfm_tlv_tree, hf_tlv_ma_domain_length,
- tvb, tlv_data_offset, 1, FALSE);
- tlv_ma_domain_length = tvb_get_guint8(tvb,tlv_data_offset);
- tlv_data_offset += 1;
- if (tlv_ma_domain_length > 0) {
- proto_tree_add_item(cfm_tlv_tree, hf_tlv_ma_domain,
+ /* If the TLV length is greater than the number of octets used for the
+ * Chassis ID, then we must have a Management Address Domain */
+ if (cfm_tlv_length > (2 + tlv_chassis_id_length)) {
+ proto_tree_add_item(cfm_tlv_tree, hf_tlv_ma_domain_length,
+ tvb, tlv_data_offset, 1, FALSE);
+ tlv_ma_domain_length = tvb_get_guint8(tvb,tlv_data_offset);
+ tlv_data_offset += 1;
+ if (tlv_ma_domain_length > 0) {
+ proto_tree_add_item(cfm_tlv_tree, hf_tlv_ma_domain,
tvb, tlv_data_offset, tlv_ma_domain_length, FALSE);
- tlv_data_offset += tlv_ma_domain_length;
- }
-
- proto_tree_add_item(cfm_tlv_tree, hf_tlv_management_addr_length,
- tvb, tlv_data_offset, 1, FALSE);
- tlv_management_addr_length = tvb_get_guint8(tvb,tlv_data_offset);
- tlv_data_offset += 1;
- if (tlv_management_addr_length > 0) {
- proto_tree_add_item(cfm_tlv_tree, hf_tlv_management_addr,
- tvb, tlv_data_offset, tlv_management_addr_length, FALSE);
- tlv_data_offset += tlv_management_addr_length;
+ tlv_data_offset += tlv_ma_domain_length;
+ }
+
+ /* If the TLV length is greater than the number of octets used for the
+ * Chassis ID and the Management Address Domain, then we must have a
+ * Management Address */
+ if (cfm_tlv_length > (2 + tlv_chassis_id_length + 1 + tlv_ma_domain_length)) {
+ proto_tree_add_item(cfm_tlv_tree, hf_tlv_management_addr_length,
+ tvb, tlv_data_offset, 1, FALSE);
+ tlv_management_addr_length = tvb_get_guint8(tvb,tlv_data_offset);
+ tlv_data_offset += 1;
+ if (tlv_management_addr_length > 0) {
+ proto_tree_add_item(cfm_tlv_tree, hf_tlv_management_addr,
+ tvb, tlv_data_offset, tlv_management_addr_length, FALSE);
+ tlv_data_offset += tlv_management_addr_length;
+ }
+ }
}
break;
case PORT_STAT_TLV: