aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlavio Santes <flavio.santes@1byt3.com>2017-11-09 18:34:04 -0500
committerAnders Broman <a.broman58@gmail.com>2017-11-11 09:33:37 +0000
commitd337f4c5b74a2824bc7de34161ac30b54a3b0e4e (patch)
tree612bd3e12d2af8b52ba6a17aabb2d92acbfafe3c
parentbce5b50f734bfd63b29ce44bfce29cb2d0d094b9 (diff)
dissector/mqtt: Payload length computation
This patch modifies how the payload length is computed. With this patch we want to simplify and reduce the number of operations. Change-Id: Ie1c9a3f26c689e92fbbd57c34e4f68abd3ea7d02 Signed-off-by: Flavio Santes <flavio.santes@1byt3.com> Reviewed-on: https://code.wireshark.org/review/24336 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-mqtt.c29
1 files changed, 8 insertions, 21 deletions
diff --git a/epan/dissectors/packet-mqtt.c b/epan/dissectors/packet-mqtt.c
index 8648c5f053..f9bed189f8 100644
--- a/epan/dissectors/packet-mqtt.c
+++ b/epan/dissectors/packet-mqtt.c
@@ -604,6 +604,7 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
gint mqtt_msg_len = 0;
guint16 mqtt_str_len;
guint16 mqtt_len_offset;
+ gint mqtt_payload_len;
conversation_t *conv;
mqtt_conv_t *mqtt;
@@ -799,34 +800,30 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
mqtt_str_len = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(mqtt_tree, hf_mqtt_topic_len, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- mqtt_msg_len -= 2;
proto_tree_add_item_ret_string(mqtt_tree, hf_mqtt_topic, tvb, offset, mqtt_str_len, ENC_UTF_8|ENC_NA,
wmem_epan_scope(), &topic_str);
offset += mqtt_str_len;
- mqtt_msg_len -= mqtt_str_len;
/* Message ID is included only when QoS > 0 */
if(mqtt_fixed_hdr & MQTT_MASK_QOS)
{
proto_tree_add_item(mqtt_tree, hf_mqtt_msgid, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- mqtt_msg_len -= 2;
}
if (mqtt->runtime_proto_version == MQTT_PROTO_V50)
{
guint32 mqtt_prop_offset = dissect_mqtt_properties(tvb, mqtt_tree, offset);
offset += mqtt_prop_offset;
-
- mqtt_msg_len -= mqtt_prop_offset;
}
- proto_tree_add_item(mqtt_tree, hf_mqtt_pubmsg, tvb, offset, mqtt_msg_len, ENC_UTF_8|ENC_NA);
+ mqtt_payload_len = tvb_reported_length(tvb) - offset;
+ proto_tree_add_item(mqtt_tree, hf_mqtt_pubmsg, tvb, offset, mqtt_payload_len, ENC_UTF_8|ENC_NA);
if (num_mqtt_message_decodes > 0)
{
- tvbuff_t *msg_tvb = tvb_new_subset_length(tvb, offset, mqtt_msg_len);
+ tvbuff_t *msg_tvb = tvb_new_subset_length(tvb, offset, mqtt_payload_len);
mqtt_user_decode_message(tree, mqtt_tree, pinfo, topic_str, msg_tvb);
}
break;
@@ -839,28 +836,20 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
proto_tree_add_item(mqtt_tree, hf_mqtt_msgid, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- /* Subtract the Packet Id size to compute the Payload length */
- mqtt_msg_len -= 2;
-
if (mqtt->runtime_proto_version == MQTT_PROTO_V50)
{
guint32 mqtt_prop_offset = dissect_mqtt_properties(tvb, mqtt_tree, offset);
offset += mqtt_prop_offset;
-
- /* Subtract the Property offset to compute the Payload length */
- mqtt_msg_len -= mqtt_prop_offset;
}
- while (mqtt_msg_len > 0)
+ while (offset < (guint32)tvb_reported_length(tvb))
{
mqtt_str_len = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(mqtt_tree, hf_mqtt_topic_len, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- mqtt_msg_len -= 2;
proto_tree_add_item(mqtt_tree, hf_mqtt_topic, tvb, offset, mqtt_str_len, ENC_UTF_8|ENC_NA);
offset += mqtt_str_len;
- mqtt_msg_len -= mqtt_str_len;
if (mqtt->runtime_proto_version == MQTT_PROTO_V50)
{
@@ -874,7 +863,6 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
}
offset += 1;
- mqtt_msg_len -= 1;
}
break;
@@ -885,16 +873,15 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
*/
proto_tree_add_item(mqtt_tree, hf_mqtt_msgid, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- for(mqtt_msg_len -= 2; mqtt_msg_len > 0;)
+
+ while (offset < (guint32)tvb_reported_length(tvb))
{
mqtt_str_len = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(mqtt_tree, hf_mqtt_topic_len, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
- mqtt_msg_len -= 2;
proto_tree_add_item(mqtt_tree, hf_mqtt_topic, tvb, offset, mqtt_str_len, ENC_UTF_8|ENC_NA);
offset += mqtt_str_len;
- mqtt_msg_len -= mqtt_str_len;
}
break;
@@ -910,7 +897,7 @@ static int dissect_mqtt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
offset += dissect_mqtt_properties(tvb, mqtt_tree, offset);
}
- for(mqtt_msg_len -= 2; mqtt_msg_len > 0; mqtt_msg_len--)
+ while (offset < (guint32)tvb_reported_length(tvb))
{
proto_tree_add_item(mqtt_tree, hf_mqtt_suback_qos, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;