forked from osmocom/wireshark
rpc: use direct hashing rather than malloced ints
Equivalent but saves some allocations and is slightly simpler. Change-Id: Id0fde980e11256018641d8fb39330c07f33ee3f5 Reviewed-on: https://code.wireshark.org/review/9474 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Reviewed-by: Evan Huus <eapache@gmail.com>
This commit is contained in:
parent
d52837d10d
commit
750babc53a
|
@ -476,7 +476,7 @@ rpc_init_proc_table(int proto, guint prog, guint vers, const vsff *proc_table,
|
|||
* Add the operation number hfinfo value for this version of the
|
||||
* program.
|
||||
*/
|
||||
rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs, &prog);
|
||||
rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs, GUINT_TO_POINTER(prog));
|
||||
DISSECTOR_ASSERT(rpc_prog != NULL);
|
||||
rpc_prog->procedure_hfs = g_array_set_size(rpc_prog->procedure_hfs,
|
||||
vers);
|
||||
|
@ -551,12 +551,8 @@ rpc_prog_free_val(gpointer v)
|
|||
void
|
||||
rpc_init_prog(int proto, guint32 prog, int ett)
|
||||
{
|
||||
guint32 *key;
|
||||
rpc_prog_info_value *value;
|
||||
|
||||
key = g_new(guint32, 1);
|
||||
*key = prog;
|
||||
|
||||
value = (rpc_prog_info_value *) g_malloc(sizeof(rpc_prog_info_value));
|
||||
value->proto = find_protocol_by_id(proto);
|
||||
value->proto_id = proto;
|
||||
|
@ -564,7 +560,7 @@ rpc_init_prog(int proto, guint32 prog, int ett)
|
|||
value->progname = proto_get_protocol_short_name(value->proto);
|
||||
value->procedure_hfs = g_array_new(FALSE, TRUE, sizeof (int));
|
||||
|
||||
g_hash_table_insert(rpc_progs,key,value);
|
||||
g_hash_table_insert(rpc_progs,GUINT_TO_POINTER(prog),value);
|
||||
}
|
||||
|
||||
|
||||
|
@ -576,7 +572,7 @@ rpc_prog_hf(guint32 prog, guint32 vers)
|
|||
{
|
||||
rpc_prog_info_value *rpc_prog;
|
||||
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,&prog))) {
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,GUINT_TO_POINTER(prog)))) {
|
||||
return g_array_index(rpc_prog->procedure_hfs, int, vers);
|
||||
}
|
||||
return -1;
|
||||
|
@ -591,7 +587,7 @@ rpc_prog_name(guint32 prog)
|
|||
const char *progname = NULL;
|
||||
rpc_prog_info_value *rpc_prog;
|
||||
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,&prog)) == NULL) {
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,GUINT_TO_POINTER(prog))) == NULL) {
|
||||
progname = "Unknown";
|
||||
}
|
||||
else {
|
||||
|
@ -1916,14 +1912,14 @@ dissect_rpc_continuation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
*/
|
||||
|
||||
static void
|
||||
make_fake_rpc_prog_if_needed (guint32 *prpc_prog_key, guint prog_ver)
|
||||
make_fake_rpc_prog_if_needed (guint32 prpc_prog_key, guint prog_ver)
|
||||
{
|
||||
/* sanity check: no one uses versions > 10 */
|
||||
if(prog_ver>10){
|
||||
return;
|
||||
}
|
||||
|
||||
if(g_hash_table_lookup(rpc_progs, prpc_prog_key) == NULL) {
|
||||
if(g_hash_table_lookup(rpc_progs, GUINT_TO_POINTER(prpc_prog_key)) == NULL) {
|
||||
/* ok this is not a known rpc program so we
|
||||
* will have to fake it.
|
||||
*/
|
||||
|
@ -1934,13 +1930,13 @@ make_fake_rpc_prog_if_needed (guint32 *prpc_prog_key, guint prog_ver)
|
|||
{ 0,NULL,NULL,NULL }
|
||||
};
|
||||
|
||||
NAME = g_strdup_printf("Unknown RPC Program:%d", *prpc_prog_key);
|
||||
Name = g_strdup_printf("RPC:%d", *prpc_prog_key);
|
||||
name = g_strdup_printf("rpc%d", *prpc_prog_key);
|
||||
NAME = g_strdup_printf("Unknown RPC Program:%d", prpc_prog_key);
|
||||
Name = g_strdup_printf("RPC:%d", prpc_prog_key);
|
||||
name = g_strdup_printf("rpc%d", prpc_prog_key);
|
||||
proto_rpc_unknown_program = proto_register_protocol(NAME, Name, name);
|
||||
|
||||
rpc_init_prog(proto_rpc_unknown_program, *prpc_prog_key, ett_rpc_unknown_program);
|
||||
rpc_init_proc_table(proto_rpc, *prpc_prog_key, prog_ver, unknown_proc, hf_rpc_procedure);
|
||||
rpc_init_prog(proto_rpc_unknown_program, prpc_prog_key, ett_rpc_unknown_program);
|
||||
rpc_init_proc_table(proto_rpc, prpc_prog_key, prog_ver, unknown_proc, hf_rpc_procedure);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2062,9 +2058,9 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
return FALSE;
|
||||
}
|
||||
version=tvb_get_ntohl(tvb, offset+16);
|
||||
make_fake_rpc_prog_if_needed (&rpc_prog_key, version);
|
||||
make_fake_rpc_prog_if_needed (rpc_prog_key, version);
|
||||
}
|
||||
if( (rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs, &rpc_prog_key)) == NULL) {
|
||||
if( (rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs, GUINT_TO_POINTER(rpc_prog_key))) == NULL) {
|
||||
/* They're not, so it's probably not an RPC call. */
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2492,7 +2488,7 @@ dissect_rpc_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
}
|
||||
|
||||
rpc_prog_key = prog;
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,&rpc_prog_key)) == NULL) {
|
||||
if ((rpc_prog = (rpc_prog_info_value *)g_hash_table_lookup(rpc_progs,GUINT_TO_POINTER(rpc_prog_key))) == NULL) {
|
||||
proto = NULL;
|
||||
proto_id = 0;
|
||||
ett = 0;
|
||||
|
@ -4132,8 +4128,8 @@ proto_register_rpc(void)
|
|||
* will be called before any handoff registration routines
|
||||
* are called.
|
||||
*/
|
||||
rpc_progs = g_hash_table_new_full(g_int_hash, g_int_equal,
|
||||
g_free, rpc_prog_free_val);
|
||||
rpc_progs = g_hash_table_new_full(g_direct_hash, g_direct_equal,
|
||||
NULL, rpc_prog_free_val);
|
||||
|
||||
authgss_contexts=wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
|
||||
}
|
||||
|
|
|
@ -361,14 +361,14 @@ rpcstat_program_select(GtkWidget *prog_combo_box, gpointer user_data)
|
|||
static void
|
||||
rpcstat_list_programs(gpointer *key, gpointer *value, gpointer user_data)
|
||||
{
|
||||
guint32 *k=(guint32*)key;
|
||||
guint32 k=GPOINTER_TO_INT(key);
|
||||
rpc_prog_info_value *v=(rpc_prog_info_value *)value;
|
||||
GtkComboBox *prog_combo_box = (GtkComboBox *)user_data;
|
||||
|
||||
ws_combo_box_append_text_and_pointer(prog_combo_box, v->progname, k);
|
||||
ws_combo_box_append_text_and_pointer(prog_combo_box, v->progname, &k);
|
||||
|
||||
if(!rpc_program){
|
||||
rpc_program=*k;
|
||||
rpc_program=k;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue