Wireshark-dev: [Wireshark-dev] [PATCH] Fix State management of MySQL dissector
From: Jess Balint <jbalint@xxxxxxxxx>
Date: Mon, 18 Jun 2007 01:25:05 -0500
Hi, I've attached a patch to fix the state management for the MySQL protocol dissector. Jess
Index: epan/dissectors/packet-mysql.c =================================================================== --- epan/dissectors/packet-mysql.c (revision 22112) +++ epan/dissectors/packet-mysql.c (working copy) @@ -320,8 +320,9 @@ {0, NULL} }; +/* starting state for each capture frame (per-conversation) */ +static GArray *conv_frame_states = NULL; - /* protocol id */ static int proto_mysql = -1; @@ -466,6 +467,7 @@ /* function prototypes */ void proto_reg_handoff_mysql(void); void proto_register_mysql(void); +static void mysql_dissect_init(void); static void dissect_mysql(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static guint get_mysql_pdu_len(packet_info *pinfo, tvbuff_t *tvb, int offset); static void dissect_mysql_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); @@ -496,7 +498,24 @@ dissector_add("tcp.port", TCP_PORT_MySQL, mysql_handle); } +/* dissector init / memory mgmt */ +static void mysql_dissect_init(void) +{ + if(conv_frame_states) + { + guint i; + /* free the frame-state array for each conversation */ + for(i = 0; i < conv_frame_states->len; ++i) + { + g_byte_array_free(g_array_index(conv_frame_states, + GByteArray *, i), TRUE); + } + g_array_free(conv_frame_states, TRUE); + } + conv_frame_states = g_array_new(FALSE, TRUE, sizeof(GByteArray *)); +} + /* protocol registration */ void proto_register_mysql(void) { @@ -891,6 +910,7 @@ module_t *mysql_module; + register_init_routine(&mysql_dissect_init); proto_mysql= proto_register_protocol("MySQL Protocol", "MySQL", "mysql"); proto_register_field_array(proto_mysql, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); @@ -901,8 +921,6 @@ "Whether the MySQL dissector should reassemble MySQL buffers spanning multiple TCP segments." " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", &mysql_desegment); - - register_dissector("mysql", dissect_mysql_pdu, proto_mysql); } @@ -932,6 +950,7 @@ guint packet_number; gboolean is_response; my_conn_data_t *conn_data; + GByteArray *frame_states; #ifdef CTDEBUG my_proto_state_t state_in, state_out; guint64 generation; @@ -948,6 +967,14 @@ pinfo->destport, 0); } + if (conv_frame_states->len <= conversation->index) { + frame_states = g_byte_array_new(); + g_array_append_val(conv_frame_states, frame_states); + } else { + frame_states = g_array_index(conv_frame_states, GByteArray *, + conversation->index); + } + /* get associated state information, create if neccessary */ conn_data= conversation_get_proto_data(conversation, proto_mysql); if (!conn_data) { @@ -963,6 +990,13 @@ conversation_add_proto_data(conversation, proto_mysql, conn_data); } + if (frame_states->len <= pinfo->fd->num) { + g_byte_array_set_size(frame_states, pinfo->fd->num + 1); + frame_states->data[pinfo->fd->num] = conn_data->state; + } else { + conn_data->state = frame_states->data[pinfo->fd->num]; + } + if (check_col(pinfo->cinfo, COL_PROTOCOL)) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "MySQL"); } @@ -1000,7 +1034,7 @@ } #endif - if (is_response ) { + if (is_response) { if (packet_number == 0) { if (check_col(pinfo->cinfo, COL_INFO)) { col_add_str(pinfo->cinfo, COL_INFO, "Server Greeting" );
- Follow-Ups:
- Re: [Wireshark-dev] [PATCH] Fix State management of MySQL dissector
- From: Jess Balint
- Re: [Wireshark-dev] [PATCH] Fix State management of MySQL dissector
- Prev by Date: Re: [Wireshark-dev] [PATCH] MySQL cosmetic change
- Next by Date: Re: [Wireshark-dev] [PATCH] MySQL cosmetic change
- Previous by thread: Re: [Wireshark-dev] invoking tcp sub-dissectors from a custom dissector
- Next by thread: Re: [Wireshark-dev] [PATCH] Fix State management of MySQL dissector
- Index(es):