diff options
author | Michael Mann <mmann78@netscape.net> | 2017-04-17 23:02:57 -0400 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-04-18 13:39:26 +0000 |
commit | d46adfe75377323508dbf9443f35baa81e4a2471 (patch) | |
tree | de3a47af05080e2813b77e038d2b4180f58af5bc /epan/dissectors/packet-x11.c | |
parent | 6c33af3d16c84066ef2cd33b649a9e9232784c56 (diff) |
X11: GHashTable -> wmem_map
A few other cleanups related to switching to wmem_alloc()ed memory
Change-Id: I86229affaa6b89dc86ab1589471734bba9efe50d
Reviewed-on: https://code.wireshark.org/review/21184
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-x11.c')
-rw-r--r-- | epan/dissectors/packet-x11.c | 140 |
1 files changed, 49 insertions, 91 deletions
diff --git a/epan/dissectors/packet-x11.c b/epan/dissectors/packet-x11.c index f1fa647f9d..a0ac8b2756 100644 --- a/epan/dissectors/packet-x11.c +++ b/epan/dissectors/packet-x11.c @@ -124,17 +124,16 @@ Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; #define NoSymbol 0L /* special KeySym */ typedef struct _x11_conv_data { - struct _x11_conv_data *next; - GHashTable *seqtable; /* hashtable of sequencenumber <-> opcode. */ - GHashTable *valtable; /* hashtable of sequencenumber <-> &opcode_vals */ + wmem_map_t *seqtable; /* hashtable of sequencenumber <-> opcode. */ + wmem_map_t *valtable; /* hashtable of sequencenumber <-> &opcode_vals */ /* major opcodes including extensions (NULL terminated) */ value_string opcode_vals[MAX_OPCODES+1]; /* error codes including extensions (NULL terminated) */ value_string errorcode_vals[LastExtensionError + 2]; /* event codes including extensions (NULL terminated) */ value_string eventcode_vals[LastExtensionEvent + 2]; - GHashTable *eventcode_funcs; /* hashtable of eventcode <-> dissect_event() */ - GHashTable *reply_funcs; /* hashtable of opcode <-> dissect_reply() */ + wmem_map_t *eventcode_funcs; /* hashtable of eventcode <-> dissect_event() */ + wmem_map_t *reply_funcs; /* hashtable of opcode <-> dissect_reply() */ int sequencenumber; /* sequencenumber of current packet. */ guint32 iconn_frame; /* frame # of initial connection request */ @@ -155,13 +154,11 @@ typedef struct _x11_conv_data { } request; } x11_conv_data_t; -static x11_conv_data_t *x11_conv_data_list = NULL; - -static GHashTable *extension_table; /* hashtable of extension name <-> dispatch function */ -static GHashTable *event_table; /* hashtable of extension name <-> event info list */ -static GHashTable *genevent_table; /* hashtable of extension name <-> generic event info list */ -static GHashTable *error_table; /* hashtable of extension name <-> error list */ -static GHashTable *reply_table; /* hashtable of extension name <-> reply list */ +static wmem_map_t *extension_table; /* hashtable of extension name <-> dispatch function */ +static wmem_map_t *event_table; /* hashtable of extension name <-> event info list */ +static wmem_map_t *genevent_table; /* hashtable of extension name <-> generic event info list */ +static wmem_map_t *error_table; /* hashtable of extension name <-> error list */ +static wmem_map_t *reply_table; /* hashtable of extension name <-> reply list */ /* Initialize the protocol and registered fields */ static int proto_x11 = -1; @@ -1935,18 +1932,15 @@ static void listOfKeycode(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf, for (m = 0; m < array_length(modifiers); ++m, *offsetp += keycodes_per_modifier) { - const guint8 *p; proto_item *tikc; int i; - p = tvb_get_ptr(tvb, *offsetp, keycodes_per_modifier); - modifiermap[m] = (int *) - g_malloc(sizeof(*modifiermap[m]) * keycodes_per_modifier); - tikc = proto_tree_add_bytes_format(tt, hf_x11_keycodes_item, tvb, - *offsetp, keycodes_per_modifier, p, "item: "); + *offsetp, keycodes_per_modifier, NULL, "item: "); + modifiermap[m] = (int *) + wmem_alloc(wmem_file_scope(), sizeof(*modifiermap[m]) * keycodes_per_modifier); for(i = 0; i < keycodes_per_modifier; ++i) { - guchar c = p[i]; + guchar c = tvb_get_guint8(tvb, (*offsetp) + i); if (c) proto_item_append_text(tikc, " %s=%d", modifiers[m], c); @@ -1985,7 +1979,7 @@ static void listOfKeysyms(tvbuff_t *tvb, packet_info *pinfo, int *offsetp, proto tvb_ensure_bytes_exist(tvb, *offsetp, 4 * keysyms_per_keycode); keycodemap[keycode] - = (int *)g_malloc(sizeof(*keycodemap[keycode]) * keysyms_per_keycode); + = (int *)wmem_alloc(wmem_file_scope(), sizeof(*keycodemap[keycode]) * keysyms_per_keycode); for(i = 0; i < keysyms_per_keycode; ++i) { /* keysymvalue = byte3 * 256 + byte4. */ @@ -2689,26 +2683,6 @@ static void windowAttributes(tvbuff_t *tvb, int *offsetp, proto_tree *t, ENDBITMASK; } -static void x11_cleanup(void) -{ - x11_conv_data_t *state; - - for (state = x11_conv_data_list; state != NULL; ) { - x11_conv_data_t *last; - - g_hash_table_destroy(state->eventcode_funcs); - g_hash_table_destroy(state->reply_funcs); - - g_hash_table_destroy(state->seqtable); - g_hash_table_destroy(state->valtable); - - last = state; - state = state->next; - g_free(last); - } - x11_conv_data_list = NULL; -} - /************************************************************************ *** *** *** G U E S S I N G T H E B Y T E O R D E R I N G *** @@ -3111,7 +3085,7 @@ static void dissect_x11_initial_conn(tvbuff_t *tvb, packet_info *pinfo, * ...and we're expecting a reply to it. */ state->sequencenumber = 0; - g_hash_table_insert(state->seqtable, GINT_TO_POINTER(state->sequencenumber), + wmem_map_insert(state->seqtable, GINT_TO_POINTER(state->sequencenumber), (int *)INITIAL_CONN); } @@ -3198,12 +3172,12 @@ static void set_handler(const char *name, void (*func)(tvbuff_t *tvb, packet_inf const x11_generic_event_info *genevent_info, const x11_reply_info *reply_info) { - g_hash_table_insert(extension_table, (gpointer)name, (gpointer)func); - g_hash_table_insert(error_table, (gpointer)name, (gpointer)errors); - g_hash_table_insert(event_table, (gpointer)name, (gpointer)event_info); + wmem_map_insert(extension_table, (gpointer)name, (gpointer)func); + wmem_map_insert(error_table, (gpointer)name, (gpointer)errors); + wmem_map_insert(event_table, (gpointer)name, (gpointer)event_info); if (genevent_info) - g_hash_table_insert(genevent_table, (gpointer)name, (gpointer)genevent_info); - g_hash_table_insert(reply_table, (gpointer)name, (gpointer)reply_info); + wmem_map_insert(genevent_table, (gpointer)name, (gpointer)genevent_info); + wmem_map_insert(reply_table, (gpointer)name, (gpointer)reply_info); } #include "x11-extension-errors.h" @@ -3219,7 +3193,7 @@ static void tryExtension(int opcode, tvbuff_t *tvb, packet_info *pinfo, int *off if (!extension) return; - func = (void (*)(tvbuff_t *, packet_info *, int *, proto_tree *, guint))g_hash_table_lookup(extension_table, extension); + func = (void (*)(tvbuff_t *, packet_info *, int *, proto_tree *, guint))wmem_map_lookup(extension_table, extension); if (func) func(tvb, pinfo, offsetp, t, byte_order); } @@ -3229,7 +3203,7 @@ static void tryExtensionReply(int opcode, tvbuff_t *tvb, packet_info *pinfo, int { void (*func)(tvbuff_t *tvb, packet_info *pinfo, int *offsetp, proto_tree *t, guint byte_order); - func = (void (*)(tvbuff_t *, packet_info *, int *, proto_tree *, guint))g_hash_table_lookup(state->reply_funcs, GINT_TO_POINTER(opcode)); + func = (void (*)(tvbuff_t *, packet_info *, int *, proto_tree *, guint))wmem_map_lookup(state->reply_funcs, GINT_TO_POINTER(opcode)); if (func) func(tvb, pinfo, offsetp, t, byte_order); else @@ -3241,7 +3215,7 @@ static void tryExtensionEvent(int event, tvbuff_t *tvb, int *offsetp, proto_tree { void (*func)(tvbuff_t *tvb, int *offsetp, proto_tree *t, guint byte_order); - func = (void (*)(tvbuff_t *, int *, proto_tree *, guint))g_hash_table_lookup(state->eventcode_funcs, GINT_TO_POINTER(event)); + func = (void (*)(tvbuff_t *, int *, proto_tree *, guint))wmem_map_lookup(state->eventcode_funcs, GINT_TO_POINTER(event)); if (func) func(tvb, offsetp, t, byte_order); } @@ -3270,7 +3244,7 @@ static void tryGenericExtensionEvent(tvbuff_t *tvb, int *offsetp, proto_tree *t, if (extname) { x11_generic_event_info *info; - info = (x11_generic_event_info *)g_hash_table_lookup(genevent_table, extname); + info = (x11_generic_event_info *)wmem_map_lookup(genevent_table, extname); if (info) { int i; @@ -3299,7 +3273,7 @@ static void register_extension(x11_conv_data_t *state, value_string *vals_p, vals_p->value = major_opcode; - error_string = (const char **)g_hash_table_lookup(error_table, vals_p->strptr); + error_string = (const char **)wmem_map_lookup(error_table, vals_p->strptr); while (error_string && *error_string && first_error <= LastExtensionError) { /* store string of extension error */ for (i = 0; i <= LastExtensionError; i++) { @@ -3317,7 +3291,7 @@ static void register_extension(x11_conv_data_t *state, value_string *vals_p, error_string++; } - event_info = (x11_event_info *)g_hash_table_lookup(event_table, vals_p->strptr); + event_info = (x11_event_info *)wmem_map_lookup(event_table, vals_p->strptr); while (event_info && event_info->name && first_event <= LastExtensionEvent) { /* store string of extension event */ for (i = 0; i <= LastExtensionEvent; i++) { @@ -3333,16 +3307,16 @@ static void register_extension(x11_conv_data_t *state, value_string *vals_p, } /* store event decode function */ - g_hash_table_insert(state->eventcode_funcs, GINT_TO_POINTER(first_event), (gpointer)event_info->dissect); + wmem_map_insert(state->eventcode_funcs, GINT_TO_POINTER(first_event), (gpointer)event_info->dissect); first_event++; event_info++; } - reply_info = (x11_reply_info *)g_hash_table_lookup(reply_table, vals_p->strptr); + reply_info = (x11_reply_info *)wmem_map_lookup(reply_table, vals_p->strptr); if (reply_info) for (i = 0; reply_info[i].dissect; i++) - g_hash_table_insert(state->reply_funcs, + wmem_map_insert(state->reply_funcs, GINT_TO_POINTER(major_opcode | (reply_info[i].minor << 8)), (gpointer)reply_info[i].dissect); } @@ -3407,13 +3381,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, if (state->opcode_vals[i].strptr == NULL) { state->opcode_vals[i].strptr = name; state->opcode_vals[i].value = -1; - g_hash_table_insert(state->valtable, + wmem_map_insert(state->valtable, GINT_TO_POINTER(state->sequencenumber), (int *)&state->opcode_vals[i]); break; } else if (strcmp(state->opcode_vals[i].strptr, name) == 0) { - g_hash_table_insert(state->valtable, + wmem_map_insert(state->valtable, GINT_TO_POINTER(state->sequencenumber), (int *)&state->opcode_vals[i]); break; @@ -3465,7 +3439,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, /* * Those requests expect a reply. */ - g_hash_table_insert(state->seqtable, + wmem_map_insert(state->seqtable, GINT_TO_POINTER(state->sequencenumber), GINT_TO_POINTER(opcode)); @@ -3479,7 +3453,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, guint32 minor; minor = tvb_get_guint8(tvb, 1); - g_hash_table_insert(state->seqtable, + wmem_map_insert(state->seqtable, GINT_TO_POINTER(state->sequencenumber), GINT_TO_POINTER(opcode | (minor << 8))); } @@ -4566,7 +4540,7 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, } if (state->iconn_frame == pinfo->num || - (g_hash_table_lookup(state->seqtable, + (wmem_map_lookup(state->seqtable, GINT_TO_POINTER(state->sequencenumber)) == (int *)NOTHING_SEEN && (opcode == 'B' || opcode == 'l') && (plen == 11 || plen == 2816))) { @@ -4761,10 +4735,8 @@ x11_stateinit(conversation_t *conversation) static x11_conv_data_t stateinit; int i; - state = (x11_conv_data_t *)g_malloc(sizeof (x11_conv_data_t)); + state = wmem_new(wmem_file_scope(), x11_conv_data_t); *state = stateinit; - state->next = x11_conv_data_list; - x11_conv_data_list = state; /* initialise opcodes */ for (i = 0; opcode_vals[i].strptr != NULL; i++) { @@ -4795,12 +4767,12 @@ x11_stateinit(conversation_t *conversation) state->eventcode_vals[i].value = 0; state->eventcode_vals[i].strptr = NULL; } - state->eventcode_funcs = g_hash_table_new(g_direct_hash, g_direct_equal); - state->reply_funcs = g_hash_table_new(g_direct_hash, g_direct_equal); + state->eventcode_funcs = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); + state->reply_funcs = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); - state->seqtable = g_hash_table_new(g_direct_hash, g_direct_equal); - state->valtable = g_hash_table_new(g_direct_hash, g_direct_equal); - g_hash_table_insert(state->seqtable, (int *)0, (int *)NOTHING_SEEN); + state->seqtable = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); + state->valtable = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); + wmem_map_insert(state->seqtable, (int *)0, (int *)NOTHING_SEEN); state->byte_order = BYTE_ORDER_UNKNOWN; /* don't know yet*/ conversation_add_proto_data(conversation, proto_x11, state); return state; @@ -4876,7 +4848,7 @@ dissect_x11_replies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) * - requestreply (reply to a request) * - event (some event occurred) */ - if (g_hash_table_lookup(state->seqtable, + if (wmem_map_lookup(state->seqtable, GINT_TO_POINTER(state->sequencenumber)) == (int *)INITIAL_CONN || (state->iconn_reply == pinfo->num)) { /* @@ -4975,7 +4947,7 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, */ sequence_number = VALUE16(tvb, offset + 2); - opcode = GPOINTER_TO_INT(g_hash_table_lookup(state->seqtable, + opcode = GPOINTER_TO_INT(wmem_map_lookup(state->seqtable, GINT_TO_POINTER(sequence_number))); if (state->iconn_frame == 0 && state->resync == FALSE) { @@ -5030,7 +5002,7 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, break; } - vals_p = (value_string *)g_hash_table_lookup(state->valtable, + vals_p = (value_string *)wmem_map_lookup(state->valtable, GINT_TO_POINTER(sequence_number)); if (vals_p != NULL) { major_opcode = VALUE8(tvb, offset + 9); @@ -5038,7 +5010,7 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, first_error = VALUE8(tvb, offset + 11); register_extension(state, vals_p, major_opcode, first_event, first_error); - g_hash_table_remove(state->valtable, + wmem_map_remove(state->valtable, GINT_TO_POINTER(sequence_number)); } break; @@ -5768,16 +5740,6 @@ dissect_x11(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) return tvb_captured_length(tvb); } -static void -x11_shutdown(void) -{ - g_hash_table_destroy(extension_table); - g_hash_table_destroy(error_table); - g_hash_table_destroy(event_table); - g_hash_table_destroy(genevent_table); - g_hash_table_destroy(reply_table); -} - /* Register the protocol with Wireshark */ void proto_register_x11(void) { @@ -5849,13 +5811,11 @@ void proto_register_x11(void) expert_x11 = expert_register_protocol(proto_x11); expert_register_field_array(expert_x11, ei, array_length(ei)); - register_cleanup_routine(x11_cleanup); - - extension_table = g_hash_table_new(g_str_hash, g_str_equal); - error_table = g_hash_table_new(g_str_hash, g_str_equal); - event_table = g_hash_table_new(g_str_hash, g_str_equal); - genevent_table = g_hash_table_new(g_str_hash, g_str_equal); - reply_table = g_hash_table_new(g_str_hash, g_str_equal); + extension_table = wmem_map_new(wmem_epan_scope(), wmem_str_hash, g_str_equal); + error_table = wmem_map_new(wmem_epan_scope(), wmem_str_hash, g_str_equal); + event_table = wmem_map_new(wmem_epan_scope(), wmem_str_hash, g_str_equal); + genevent_table = wmem_map_new(wmem_epan_scope(), wmem_str_hash, g_str_equal); + reply_table = wmem_map_new(wmem_epan_scope(), wmem_str_hash, g_str_equal); register_x11_extensions(); x11_module = prefs_register_protocol(proto_x11, NULL); @@ -5864,8 +5824,6 @@ void proto_register_x11(void) "Whether the X11 dissector should reassemble messages spanning multiple TCP segments. " "To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", &x11_desegment); - - register_shutdown_routine(x11_shutdown); } void |