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 | |
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')
-rw-r--r-- | epan/dissectors/packet-xmpp-core.c | 51 | ||||
-rw-r--r-- | epan/dissectors/packet-xmpp-core.h | 7 | ||||
-rw-r--r-- | epan/dissectors/packet-xmpp-utils.c | 9 | ||||
-rw-r--r-- | epan/dissectors/packet-xmpp.c | 2 |
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 |