diff options
author | Evan Huus <eapache@gmail.com> | 2012-07-22 21:48:51 +0000 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2012-07-22 21:48:51 +0000 |
commit | daa0ff3ac80126abf74110a8fdb13a38369ba089 (patch) | |
tree | 341399cfadefcbf2ec3ee44947bcd3f5ee99e71b /epan/dissectors/packet-xmpp-core.c | |
parent | 5c75ecd4245289be43cdbdae7edd9952a44918d8 (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.c | 51 |
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) |