aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2012-07-22 21:48:51 +0000
committerEvan Huus <eapache@gmail.com>2012-07-22 21:48:51 +0000
commitdaa0ff3ac80126abf74110a8fdb13a38369ba089 (patch)
tree341399cfadefcbf2ec3ee44947bcd3f5ee99e71b /epan/dissectors
parent5c75ecd4245289be43cdbdae7edd9952a44918d8 (diff)
The XMPP dissector was allocating a new parser for every packet and never
freeing them. This was slow and leaked gobs of memory. Be like XML: allocate one parser during set-up and share it around. svn path=/trunk/; revision=43920
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-xmpp-core.c51
-rw-r--r--epan/dissectors/packet-xmpp-core.h7
-rw-r--r--epan/dissectors/packet-xmpp-utils.c9
-rw-r--r--epan/dissectors/packet-xmpp.c2
4 files changed, 44 insertions, 25 deletions
diff --git a/epan/dissectors/packet-xmpp-core.c b/epan/dissectors/packet-xmpp-core.c
index df16ac94d3..0abfa9060e 100644
--- a/epan/dissectors/packet-xmpp-core.c
+++ b/epan/dissectors/packet-xmpp-core.c
@@ -49,6 +49,10 @@
#include "epan/tvbparse.h"
+tvbparse_wanted_t *want_ignore;
+tvbparse_wanted_t *want_stream_end_tag;
+tvbparse_wanted_t *want_stream_end_with_ns;
+
static void xmpp_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
static void xmpp_error_text(proto_tree *tree, tvbuff_t *tvb, xmpp_element_t *element);
@@ -63,6 +67,34 @@ static void xmpp_failure_text(proto_tree *tree, tvbuff_t *tvb, xmpp_element_t *e
static void xmpp_features_mechanisms(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *packet);
void
+xmpp_init_parsers(void)
+{
+ tvbparse_wanted_t *want_name;
+ tvbparse_wanted_t *want_stream_end;
+
+ want_name = tvbparse_chars(2,1,0,"abcdefghijklmnopqrstuvwxyz.-_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",NULL,NULL,NULL);
+
+ want_stream_end_with_ns = tvbparse_set_seq(3, NULL, NULL, NULL,
+ want_name,
+ tvbparse_char(4, ":", NULL, NULL, NULL),
+ want_name,
+ NULL);
+
+ want_stream_end = tvbparse_set_oneof(5, NULL, NULL, NULL,
+ want_stream_end_with_ns,
+ want_name,
+ NULL);
+
+ want_ignore = tvbparse_chars(1,1,0," \t\r\n",NULL,NULL,NULL);
+
+ want_stream_end_tag = tvbparse_set_seq(6, NULL, NULL, NULL,
+ tvbparse_string(-1,"</",NULL,NULL,NULL),
+ want_stream_end,
+ tvbparse_char(-1,">",NULL,NULL,NULL),
+ NULL);
+}
+
+void
xmpp_iq(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *packet)
{
proto_item *xmpp_iq_item;
@@ -615,24 +647,7 @@ xmpp_stream_close(proto_tree *tree, tvbuff_t *tvb, packet_info* pinfo)
{
tvbparse_t *tt;
tvbparse_elem_t *elem;
- tvbparse_wanted_t *want_ignore = tvbparse_chars(1,1,0," \t\r\n",NULL,NULL,NULL);
- tvbparse_wanted_t *want_name = tvbparse_chars(2,1,0,"abcdefghijklmnopqrstuvwxyz.-_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",NULL,NULL,NULL);
- tvbparse_wanted_t *want_stream_end_with_ns = tvbparse_set_seq(3, NULL, NULL, NULL,
- want_name,
- tvbparse_char(4, ":", NULL, NULL, NULL),
- want_name,
- NULL);
-
- tvbparse_wanted_t *want_stream_end = tvbparse_set_oneof(5, NULL, NULL, NULL,
- want_stream_end_with_ns,
- want_name,
- NULL);
-
- tvbparse_wanted_t *want_stream_end_tag = tvbparse_set_seq(6, NULL, NULL, NULL,
- tvbparse_string(-1,"</",NULL,NULL,NULL),
- want_stream_end,
- tvbparse_char(-1,">",NULL,NULL,NULL),
- NULL);
+
tt = tvbparse_init(tvb,0,-1,NULL,want_ignore);
if((elem = tvbparse_get(tt,want_stream_end_tag))!=NULL)
diff --git a/epan/dissectors/packet-xmpp-core.h b/epan/dissectors/packet-xmpp-core.h
index f79aa27af4..221d4ab2e3 100644
--- a/epan/dissectors/packet-xmpp-core.h
+++ b/epan/dissectors/packet-xmpp-core.h
@@ -26,8 +26,15 @@
#ifndef XMPP_CORE_H
#define XMPP_CORE_H
+#include "epan/tvbparse.h"
+
#include "packet-xmpp-utils.h"
+extern void xmpp_init_parsers(void);
+extern tvbparse_wanted_t *want_ignore;
+extern tvbparse_wanted_t *want_stream_end_tag;
+extern tvbparse_wanted_t *want_stream_end_with_ns;
+
extern void xmpp_iq(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *packet);
extern void xmpp_presence(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *packet);
extern void xmpp_message(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *packet);
diff --git a/epan/dissectors/packet-xmpp-utils.c b/epan/dissectors/packet-xmpp-utils.c
index 82410da2e3..14af0c5015 100644
--- a/epan/dissectors/packet-xmpp-utils.c
+++ b/epan/dissectors/packet-xmpp-utils.c
@@ -38,6 +38,7 @@
#include <epan/dissectors/packet-xml.h>
#include <packet-xmpp.h>
+#include <packet-xmpp-core.h>
#include <packet-xmpp-utils.h>
@@ -534,7 +535,6 @@ xmpp_xml_frame_to_element_t(xml_frame_t *xml_frame, xmpp_element_t *parent, tvbu
xml_frame_t *child;
xmpp_element_t *node = ep_alloc0(sizeof(xmpp_element_t));
- tvbparse_wanted_t *want_ignore, *want_name, *want_scoped_name;
tvbparse_t* tt;
tvbparse_elem_t* elem;
@@ -564,14 +564,9 @@ xmpp_xml_frame_to_element_t(xml_frame_t *xml_frame, xmpp_element_t *parent, tvbu
node->offset = xml_frame->start_offset;
- /*looking for element's names that looks like ns:tag_name*/
- want_ignore = tvbparse_chars(-1,1,0," \t\r\n</",NULL,NULL,NULL);
- want_name = tvbparse_chars(-1,1,0,"abcdefghijklmnopqrstuvwxyz.-_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",NULL,NULL,NULL);
- want_scoped_name = tvbparse_set_seq(-1, NULL, NULL, NULL, want_name, tvbparse_char(-1,":",NULL,NULL,NULL), want_name, NULL);
-
tt = tvbparse_init(tvb,node->offset,-1,NULL,want_ignore);
- if((elem = tvbparse_get(tt,want_scoped_name))!=NULL)
+ if((elem = tvbparse_get(tt,want_stream_end_with_ns))!=NULL)
{
node->default_ns_abbrev = tvb_get_ephemeral_string(elem->sub->tvb, elem->sub->offset, elem->sub->len);
}
diff --git a/epan/dissectors/packet-xmpp.c b/epan/dissectors/packet-xmpp.c
index f21b9fa58a..292d7d3171 100644
--- a/epan/dissectors/packet-xmpp.c
+++ b/epan/dissectors/packet-xmpp.c
@@ -1407,6 +1407,8 @@ proto_register_xmpp(void) {
proto_register_subtree_array(ett_unknown_ptr, array_length(ett_unknown_ptr));
register_dissector("xmpp", dissect_xmpp, proto_xmpp);
+
+ xmpp_init_parsers();
}
void