aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-xmpp-core.c
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/packet-xmpp-core.c
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/packet-xmpp-core.c')
-rw-r--r--epan/dissectors/packet-xmpp-core.c51
1 files changed, 33 insertions, 18 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)