aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2017-11-02 12:42:37 +0100
committerAnders Broman <a.broman58@gmail.com>2017-11-03 05:19:58 +0000
commitf6edbcd6439666319a875c5b4d4fd80b7834c57c (patch)
tree570d5e6a1002197a35296eee56e11d7831d66674 /epan/dissectors
parentbe625b9be781e469456d01053336b18cfba63ede (diff)
mqtt: Simplify message decode matching
Change-Id: I93da46808de8a978d49ad0aa3f78c4a1790e7952 Reviewed-on: https://code.wireshark.org/review/24210 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-mqtt.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/epan/dissectors/packet-mqtt.c b/epan/dissectors/packet-mqtt.c
index b84328814c..3147fba058 100644
--- a/epan/dissectors/packet-mqtt.c
+++ b/epan/dissectors/packet-mqtt.c
@@ -319,10 +319,10 @@ UAT_PROTO_DEF(message_decode, payload_proto, payload_proto, payload_proto_name,
static void mqtt_user_decode_message(proto_tree *tree, proto_tree *mqtt_tree, packet_info *pinfo, const guint8 *topic_str, tvbuff_t *msg_tvb)
{
- dissector_handle_t payload_proto = NULL;
- const gchar *proto_name = NULL;
+ mqtt_message_decode_t *message_decode_entry = NULL;
size_t topic_str_len = strlen(topic_str);
size_t topic_pattern_len;
+ gboolean match_found = FALSE;
if (topic_str_len == 0)
{
@@ -330,52 +330,33 @@ static void mqtt_user_decode_message(proto_tree *tree, proto_tree *mqtt_tree, pa
return;
}
- for (guint i = 0; i < num_mqtt_message_decodes && !payload_proto; i++)
+ for (guint i = 0; i < num_mqtt_message_decodes && !match_found; i++)
{
- switch (mqtt_message_decodes[i].match_criteria)
+ message_decode_entry = &mqtt_message_decodes[i];
+ switch (message_decode_entry->match_criteria)
{
case MATCH_CRITERIA_EQUAL:
- if (strcmp(topic_str, mqtt_message_decodes[i].topic_pattern) == 0)
- {
- proto_name = mqtt_message_decodes[i].payload_proto_name;
- payload_proto = mqtt_message_decodes[i].payload_proto;
- }
+ match_found = (strcmp(topic_str, message_decode_entry->topic_pattern) == 0);
break;
case MATCH_CRITERIA_CONTAINS:
- if (strstr(topic_str, mqtt_message_decodes[i].topic_pattern))
- {
- proto_name = mqtt_message_decodes[i].payload_proto_name;
- payload_proto = mqtt_message_decodes[i].payload_proto;
- }
+ match_found = (strstr(topic_str, message_decode_entry->topic_pattern) != NULL);
break;
case MATCH_CRITERIA_STARTS_WITH:
- topic_pattern_len = strlen(mqtt_message_decodes[i].topic_pattern);
- if ((topic_str_len >= topic_pattern_len) &&
- strncmp(topic_str, mqtt_message_decodes[i].topic_pattern, topic_pattern_len) == 0)
- {
- proto_name = mqtt_message_decodes[i].payload_proto_name;
- payload_proto = mqtt_message_decodes[i].payload_proto;
- }
+ topic_pattern_len = strlen(message_decode_entry->topic_pattern);
+ match_found = ((topic_str_len >= topic_pattern_len) &&
+ (strncmp(topic_str, message_decode_entry->topic_pattern, topic_pattern_len) == 0));
break;
case MATCH_CRITERIA_ENDS_WITH:
- topic_pattern_len = strlen(mqtt_message_decodes[i].topic_pattern);
- if ((topic_str_len >= topic_pattern_len) &&
- strcmp(topic_str + (topic_str_len - topic_pattern_len), mqtt_message_decodes[i].topic_pattern) == 0)
- {
- proto_name = mqtt_message_decodes[i].payload_proto_name;
- payload_proto = mqtt_message_decodes[i].payload_proto;
- }
+ topic_pattern_len = strlen(message_decode_entry->topic_pattern);
+ match_found = ((topic_str_len >= topic_pattern_len) &&
+ (strcmp(topic_str + (topic_str_len - topic_pattern_len), message_decode_entry->topic_pattern) == 0));
break;
case MATCH_CRITERIA_REGEX:
- if (mqtt_message_decodes[i].topic_regex)
+ if (message_decode_entry->topic_regex)
{
GMatchInfo *match_info = NULL;
- g_regex_match(mqtt_message_decodes[i].topic_regex, topic_str, (GRegexMatchFlags) 0, &match_info);
- if (g_match_info_matches(match_info))
- {
- proto_name = mqtt_message_decodes[i].payload_proto_name;
- payload_proto = mqtt_message_decodes[i].payload_proto;
- }
+ g_regex_match(message_decode_entry->topic_regex, topic_str, (GRegexMatchFlags) 0, &match_info);
+ match_found = g_match_info_matches(match_info);
g_match_info_free(match_info);
}
break;
@@ -385,12 +366,13 @@ static void mqtt_user_decode_message(proto_tree *tree, proto_tree *mqtt_tree, pa
}
}
- if (payload_proto)
+ if (match_found)
{
- proto_item *ti = proto_tree_add_string(mqtt_tree, hf_mqtt_pubmsg_decoded, msg_tvb, 0, -1, proto_name);
+ proto_item *ti = proto_tree_add_string(mqtt_tree, hf_mqtt_pubmsg_decoded, msg_tvb, 0, -1,
+ message_decode_entry->payload_proto_name);
PROTO_ITEM_SET_GENERATED(ti);
- call_dissector(payload_proto, msg_tvb, pinfo, tree);
+ call_dissector(message_decode_entry->payload_proto, msg_tvb, pinfo, tree);
}
}