aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-assa_r3.c
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss.ws@gmail.com>2012-12-06 01:43:37 +0000
committerJeff Morriss <jeff.morriss.ws@gmail.com>2012-12-06 01:43:37 +0000
commit97bbd2fc0a713d8fa9c576fff706073d98b41ce3 (patch)
tree169943497ad8ae4f3d125a1a16c6b6295501da41 /epan/dissectors/packet-assa_r3.c
parentecad8311ca5930f3c802c81b31c431a9bb253504 (diff)
Fix inifite loop in the R3 dissector reported in
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8040 : If the alarm length is 0, raise an expert_info and break out of the loop. svn path=/trunk/; revision=46415
Diffstat (limited to 'epan/dissectors/packet-assa_r3.c')
-rw-r--r--epan/dissectors/packet-assa_r3.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/epan/dissectors/packet-assa_r3.c b/epan/dissectors/packet-assa_r3.c
index 7a6d747383..124d5ddb80 100644
--- a/epan/dissectors/packet-assa_r3.c
+++ b/epan/dissectors/packet-assa_r3.c
@@ -1,6 +1,6 @@
/* packet-assa_r3.c
* Routines for R3 packet dissection
- * Copyright (c) 2009 Assa Abloy USA <jcwren@assaabloyusa.com>
+ * Copyright (c) 2009 Assa Abloy USA <jcwren[AT]assaabloyusa.com>
*
* R3 is an electronic lock management protocol for configuring operational
* parameters, adding/removing/altering users, dumping log files, etc.
@@ -8868,7 +8868,7 @@ static void dissect_r3_cmd_filters (tvbuff_t *tvb, guint32 start_offset, guint32
proto_tree_add_item (filter_tree, hf_r3_filter_list, payload_tvb, i + 2, 1, ENC_LITTLE_ENDIAN);
}
-static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
+static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
proto_item *alarm_item;
proto_tree *alarm_tree;
@@ -8891,10 +8891,11 @@ static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset,
while (offset < (cmdLen - 2))
{
- proto_item *alarmcfg_item;
+ proto_item *alarmcfg_item, *pi;
proto_tree *alarmcfg_tree;
const gchar *ai;
const gchar *as;
+ guint32 alarm_len;
if (!(ai = match_strval_ext (tvb_get_guint8 (payload_tvb, offset + 1), &r3_alarmidnames_ext)))
{
@@ -8909,12 +8910,19 @@ static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset,
"Alarm Item (%s, %s)", ai, as);
alarmcfg_tree = proto_item_add_subtree (alarmcfg_item, ett_r3alarmcfg);
- proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_length, payload_tvb, offset + 0, 1, ENC_LITTLE_ENDIAN);
+ alarm_len = tvb_get_guint8 (payload_tvb, offset + 0);
+ pi = proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_length, payload_tvb, offset + 0, 1, ENC_LITTLE_ENDIAN);
+ if (alarm_len == 0) {
+ expert_add_info_format (pinfo, pi, PI_MALFORMED, PI_WARN,
+ "Alarm length equal to 0; payload could be partially decoded");
+ break;
+ }
+
proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_id, payload_tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_state, payload_tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
alarms++;
- offset += tvb_get_guint8 (payload_tvb, offset);
+ offset += alarm_len;
}
if (alarms)