SOME/IP: code cleanup to reduce memory leaks

This commit is contained in:
Dr. Lars Völker 2022-06-06 11:54:08 +02:00 committed by John Thacker
parent 96c4c9063f
commit 4a26993ec0
1 changed files with 156 additions and 97 deletions

View File

@ -49,6 +49,7 @@
#define SOMEIP_NAME "SOME/IP"
#define SOMEIP_NAME_LONG "SOME/IP Protocol"
#define SOMEIP_NAME_FILTER "someip"
#define SOMEIP_NAME_PREFIX "someip.payload"
#define SOMEIP_NAME_LONG_MULTIPLE "SOME/IP Protocol (Multiple Payloads)"
#define SOMEIP_NAME_LONG_BROKEN "SOME/IP: Incomplete headers!"
@ -893,11 +894,6 @@ someip_payload_free_key(gpointer key) {
wmem_free(wmem_epan_scope(), key);
}
static void
someip_payload_free_generic_data(gpointer data) {
wmem_free(wmem_epan_scope(), (void *)data);
}
static gint64
someip_parameter_key(guint16 serviceid, guint16 methodid, guint8 version, guint8 msgtype) {
gint64 tmp1;
@ -1081,7 +1077,27 @@ static void
free_someip_parameter_list_cb(void *r) {
someip_parameter_list_uat_t *rec = (someip_parameter_list_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
if (rec->filter_string) {
g_free(rec->filter_string);
rec->filter_string = NULL;
}
}
static void
free_someip_parameter_list(gpointer data) {
someip_parameter_list_t *list = (someip_parameter_list_t *)data;
if (list->items != NULL) {
wmem_free(wmem_epan_scope(), (void *)(list->items));
list->items = NULL;
}
wmem_free(wmem_epan_scope(), (void *)data);
}
static void
@ -1113,9 +1129,7 @@ post_update_someip_parameter_list_read_in_data(someip_parameter_list_uat_t *data
list->wtlv_encoding = data[i].wtlv_encoding;
list->num_of_items = data[i].num_of_params;
items = (someip_payload_parameter_item_t *)wmem_alloc_array(wmem_epan_scope(), someip_payload_parameter_item_t, data[i].num_of_params);
memset(items, 0, sizeof(someip_payload_parameter_item_t) * data[i].num_of_params);
items = (someip_payload_parameter_item_t *)wmem_alloc0_array(wmem_epan_scope(), someip_payload_parameter_item_t, data[i].num_of_params);
list->items = items;
/* create new entry ... */
@ -1147,7 +1161,7 @@ post_update_someip_parameter_list_cb(void) {
data_someip_parameter_list = NULL;
}
data_someip_parameter_list = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &someip_payload_free_generic_data);
data_someip_parameter_list = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &free_someip_parameter_list);
post_update_someip_parameter_list_read_in_data(someip_parameter_list, someip_parameter_list_num, data_someip_parameter_list);
update_dynamic_hf_entries_someip_parameter_list();
}
@ -1213,8 +1227,27 @@ update_someip_parameter_enum(void *r, char **err) {
static void
free_someip_parameter_enum_cb(void*r) {
someip_parameter_enum_uat_t *rec = (someip_parameter_enum_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->value_name) g_free(rec->value_name);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
if (rec->value_name) {
g_free(rec->value_name);
rec->value_name = NULL;
}
}
static void
free_someip_parameter_enum(gpointer data) {
someip_payload_parameter_enum_t *list = (someip_payload_parameter_enum_t *)data;
if (list->items != NULL) {
wmem_free(wmem_epan_scope(), (void *)(list->items));
list->items = NULL;
}
wmem_free(wmem_epan_scope(), (void *)data);
}
static void
@ -1245,8 +1278,7 @@ post_update_someip_parameter_enum_read_in_data(someip_parameter_enum_uat_t *data
list->id_ref = data[i].id_ref;
list->num_of_items = data[i].num_of_items;
list->items = (someip_payload_parameter_enum_item_t *)wmem_alloc_array(wmem_epan_scope(), someip_payload_parameter_enum_item_t, list->num_of_items);
memset(list->items, 0, sizeof(someip_payload_parameter_enum_item_t) * list->num_of_items);
list->items = (someip_payload_parameter_enum_item_t *)wmem_alloc0_array(wmem_epan_scope(), someip_payload_parameter_enum_item_t, list->num_of_items);
/* create new entry ... */
g_hash_table_insert(ht, key, list);
@ -1281,7 +1313,7 @@ post_update_someip_parameter_enum_cb(void) {
data_someip_parameter_enums = NULL;
}
data_someip_parameter_enums = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &someip_payload_free_generic_data);
data_someip_parameter_enums = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &free_someip_parameter_enum);
post_update_someip_parameter_enum_read_in_data(someip_parameter_enums, someip_parameter_enums_num, data_someip_parameter_enums);
}
@ -1361,6 +1393,22 @@ free_someip_parameter_array_cb(void*r) {
someip_parameter_array_uat_t *rec = (someip_parameter_array_uat_t *)r;
if (rec->name) g_free(rec->name);
rec->name = NULL;
if (rec->filter_string) g_free(rec->filter_string);
rec->filter_string = NULL;
}
static void
free_someip_parameter_array(gpointer data) {
someip_parameter_array_t *list = (someip_parameter_array_t *)data;
if (list->dims != NULL) {
wmem_free(wmem_epan_scope(), (void *)(list->dims));
list->dims = NULL;
}
wmem_free(wmem_epan_scope(), (void *)data);
}
static void
@ -1391,9 +1439,7 @@ post_update_someip_parameter_array_read_in_data(someip_parameter_array_uat_t *da
list->num_of_dims = data[i].num_of_dims;
list->filter_string = data[i].filter_string;
items = (someip_parameter_array_dim_t *)wmem_alloc_array(wmem_epan_scope(), someip_parameter_array_dim_t, data[i].num_of_dims);
memset(items, 0, sizeof(someip_parameter_array_dim_t) * data[i].num_of_dims);
items = (someip_parameter_array_dim_t *)wmem_alloc0_array(wmem_epan_scope(), someip_parameter_array_dim_t, data[i].num_of_dims);
list->dims = items;
/* create new entry ... */
@ -1422,7 +1468,7 @@ post_update_someip_parameter_array_cb(void) {
data_someip_parameter_arrays = NULL;
}
data_someip_parameter_arrays = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &someip_payload_free_generic_data);
data_someip_parameter_arrays = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &free_someip_parameter_array);
post_update_someip_parameter_array_read_in_data(someip_parameter_arrays, someip_parameter_arrays_num, data_someip_parameter_arrays);
update_dynamic_hf_entries_someip_parameter_arrays();
}
@ -1513,11 +1559,29 @@ update_someip_parameter_struct(void *r, char **err) {
}
static void
free_someip_parameter_struct_cb(void*r) {
free_someip_parameter_struct_cb(void *r) {
someip_parameter_struct_uat_t *rec = (someip_parameter_struct_uat_t *)r;
if (rec->struct_name) g_free(rec->struct_name);
rec->struct_name = NULL;
if (rec->name) g_free(rec->name);
rec->name = NULL;
if (rec->filter_string) g_free(rec->filter_string);
rec->filter_string = NULL;
}
static void
free_someip_parameter_struct(gpointer data) {
someip_payload_parameter_struct_t *list = (someip_payload_parameter_struct_t *)data;
if (list->items != NULL) {
wmem_free(wmem_epan_scope(), (void *)(list->items));
list->items = NULL;
}
wmem_free(wmem_epan_scope(), (void *)data);
}
static void
@ -1538,7 +1602,6 @@ post_update_someip_parameter_struct_read_in_data(someip_parameter_struct_uat_t *
list = (someip_payload_parameter_struct_t *)g_hash_table_lookup(ht, key);
if (list == NULL) {
list = wmem_new(wmem_epan_scope(), someip_payload_parameter_struct_t);
INIT_SOMEIP_PAYLOAD_PARAMETER_STRUCT(list)
@ -1549,9 +1612,7 @@ post_update_someip_parameter_struct_read_in_data(someip_parameter_struct_uat_t *
list->wtlv_encoding = data[i].wtlv_encoding;
list->num_of_items = data[i].num_of_items;
items = (someip_payload_parameter_item_t *)wmem_alloc_array(wmem_epan_scope(), someip_payload_parameter_item_t, data[i].num_of_items);
memset(items, 0, sizeof(someip_payload_parameter_item_t) * data[i].num_of_items);
items = (someip_payload_parameter_item_t *)wmem_alloc0_array(wmem_epan_scope(), someip_payload_parameter_item_t, data[i].num_of_items);
list->items = items;
/* create new entry ... */
@ -1581,7 +1642,7 @@ post_update_someip_parameter_struct_cb(void) {
data_someip_parameter_structs = NULL;
}
data_someip_parameter_structs = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &someip_payload_free_generic_data);
data_someip_parameter_structs = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &free_someip_parameter_struct);
post_update_someip_parameter_struct_read_in_data(someip_parameter_structs, someip_parameter_structs_num, data_someip_parameter_structs);
update_dynamic_hf_entries_someip_parameter_structs();
}
@ -1665,8 +1726,32 @@ static void
free_someip_parameter_union_cb(void*r) {
someip_parameter_union_uat_t *rec = (someip_parameter_union_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->type_name) g_free(rec->type_name);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
if (rec->type_name) {
g_free(rec->type_name);
rec->type_name = NULL;
}
if (rec->filter_string) {
g_free(rec->filter_string);
rec->filter_string = NULL;
}
}
static void
free_someip_parameter_union(gpointer data) {
someip_parameter_union_t *list = (someip_parameter_union_t *)data;
if (list->items != NULL) {
wmem_free(wmem_epan_scope(), (void *)(list->items));
list->items = NULL;
}
wmem_free(wmem_epan_scope(), (void *)data);
}
static void
@ -1697,8 +1782,7 @@ post_update_someip_parameter_union_read_in_data(someip_parameter_union_uat_t *da
list->pad_to = data[i].pad_to;
list->num_of_items = data[i].num_of_items;
list->items = (someip_parameter_union_item_t *)wmem_alloc_array(wmem_epan_scope(), someip_parameter_union_item_t, list->num_of_items);
memset(list->items, 0, sizeof(someip_parameter_union_item_t) * list->num_of_items);
list->items = (someip_parameter_union_item_t *)wmem_alloc0_array(wmem_epan_scope(), someip_parameter_union_item_t, list->num_of_items);
/* create new entry ... */
g_hash_table_insert(ht, key, list);
@ -1735,7 +1819,7 @@ post_update_someip_parameter_union_cb(void) {
data_someip_parameter_unions = NULL;
}
data_someip_parameter_unions = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &someip_payload_free_generic_data);
data_someip_parameter_unions = g_hash_table_new_full(g_int64_hash, g_int64_equal, &someip_payload_free_key, &free_someip_parameter_union);
post_update_someip_parameter_union_read_in_data(someip_parameter_unions, someip_parameter_unions_num, data_someip_parameter_unions);
update_dynamic_hf_entries_someip_parameter_unions();
}
@ -1793,8 +1877,15 @@ static void
free_someip_parameter_base_type_list_cb(void*r) {
someip_parameter_base_type_list_uat_t *rec = (someip_parameter_base_type_list_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->data_type) g_free(rec->data_type);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
if (rec->data_type) {
g_free(rec->data_type);
rec->data_type = NULL;
}
}
static void
@ -1892,8 +1983,15 @@ static void
free_someip_parameter_string_list_cb(void*r) {
someip_parameter_string_uat_t *rec = (someip_parameter_string_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->encoding) g_free(rec->encoding);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
if (rec->encoding) {
g_free(rec->encoding);
rec->encoding = NULL;
}
}
static void
@ -1962,7 +2060,11 @@ update_someip_parameter_typedef_list(void *r, char **err) {
static void
free_someip_parameter_typedef_list_cb(void*r) {
someip_parameter_typedef_uat_t *rec = (someip_parameter_typedef_uat_t *)r;
if (rec->name) g_free(rec->name);
if (rec->name) {
g_free(rec->name);
rec->name = NULL;
}
}
static void
@ -2002,6 +2104,7 @@ deregister_dynamic_hf_data(hf_register_info **hf_array, guint *hf_size) {
if ((*hf_array)[i].p_id != NULL) {
proto_deregister_field(proto_someip, *((*hf_array)[i].p_id));
g_free((*hf_array)[i].p_id);
(*hf_array)[i].p_id = NULL;
}
}
proto_add_deregistered_data(*hf_array);
@ -2120,7 +2223,7 @@ get_param_attributes(guint8 data_type, guint32 id_ref) {
}
static gint*
update_dynamic_hf_entry(hf_register_info *hf_array, int pos, guint32 data_type, guint id_ref, char *param_name, char *abbrev) {
update_dynamic_hf_entry(hf_register_info *hf_array, int pos, guint32 data_type, guint id_ref, char *param_name, char *filter_string) {
param_return_attributes_t attribs;
gint *hf_id;
@ -2143,7 +2246,7 @@ update_dynamic_hf_entry(hf_register_info *hf_array, int pos, guint32 data_type,
hf_array[pos].hfinfo.name = ws_strdup_printf("%s [%s]", param_name, attribs.base_type_name);
}
hf_array[pos].hfinfo.abbrev = abbrev;
hf_array[pos].hfinfo.abbrev = ws_strdup_printf("%s.%s", SOMEIP_NAME_PREFIX, filter_string);;
hf_array[pos].hfinfo.type = attribs.type;
hf_array[pos].hfinfo.display = attribs.display_base;
@ -2158,54 +2261,14 @@ update_dynamic_param_hf_entry(gpointer key _U_, gpointer value, gpointer data) {
someip_parameter_list_t *list = (someip_parameter_list_t *)value;
guint i = 0;
if (*pos >= dynamic_hf_param_size) {
return;
}
for (i = 0; i < list->num_of_items ; i++) {
if (*pos >= dynamic_hf_param_size) {
return;
}
someip_payload_parameter_item_t *item = &(list->items[i]);
gboolean service_name_needs_free = FALSE;
gboolean method_name_needs_free = FALSE;
guchar c;
char *service_name = someip_lookup_service_name(list->service_id);
char *method_name = someip_lookup_method_name(list->service_id, list->method_id);
if (service_name != NULL) {
c = proto_check_field_name(service_name);
if (c) {
service_name = NULL;
}
}
if (service_name == NULL) {
service_name_needs_free = TRUE;
service_name = ws_strdup_printf("0x%04x", list->service_id);
}
if (method_name != NULL) {
c = proto_check_field_name(method_name);
if (c) {
method_name = NULL;
}
}
if (method_name == NULL) {
method_name_needs_free = TRUE;
method_name = ws_strdup_printf("0x%04x", list->method_id);
}
char *abbrev = ws_strdup_printf("someip.payload.%s", item->filter_string);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_param, *pos, item->data_type, item->id_ref, item->name, abbrev);
if (service_name_needs_free) {
g_free(service_name);
}
if (method_name_needs_free) {
g_free(method_name);
}
item->hf_id = update_dynamic_hf_entry(dynamic_hf_param, *pos, item->data_type, item->id_ref, item->name, item->filter_string);
if (item->hf_id != NULL) {
(*pos)++;
@ -2217,14 +2280,12 @@ static void
update_dynamic_array_hf_entry(gpointer key _U_, gpointer value, gpointer data) {
guint32 *pos = (guint32 *)data;
someip_parameter_array_t *item = (someip_parameter_array_t *)value;
char *abbrev = NULL;
if (*pos >= dynamic_hf_array_size) {
return;
}
abbrev = ws_strdup_printf("someip.payload.%s", item->filter_string);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_array, *pos, item->data_type, item->id_ref, item->name, abbrev);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_array, *pos, item->data_type, item->id_ref, item->name, item->filter_string);
if (item->hf_id != NULL) {
(*pos)++;
@ -2237,15 +2298,13 @@ update_dynamic_struct_hf_entry(gpointer key _U_, gpointer value, gpointer data)
someip_payload_parameter_struct_t *list = (someip_payload_parameter_struct_t *)value;
guint i = 0;
if (*pos >= dynamic_hf_struct_size) {
return;
}
for (i = 0; i < list->num_of_items; i++) {
if (*pos >= dynamic_hf_struct_size) {
return;
}
someip_payload_parameter_item_t *item = &(list->items[i]);
char *abbrev = ws_strdup_printf("someip.payload.%s", item->filter_string);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_struct, *pos, item->data_type, item->id_ref, item->name, abbrev);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_struct, *pos, item->data_type, item->id_ref, item->name, item->filter_string);
if (item->hf_id != NULL) {
(*pos)++;
@ -2259,15 +2318,14 @@ update_dynamic_union_hf_entry(gpointer key _U_, gpointer value, gpointer data) {
someip_parameter_union_t *list = (someip_parameter_union_t *)value;
guint i = 0;
if (*pos >= dynamic_hf_union_size) {
return;
}
for (i = 0; i < list->num_of_items; i++) {
if (*pos >= dynamic_hf_union_size) {
return;
}
someip_parameter_union_item_t *item = &(list->items[i]);
char *abbrev = ws_strdup_printf("someip.payload.%s", item->filter_string);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_union, *pos, item->data_type, item->id_ref, item->name, abbrev);
item->hf_id = update_dynamic_hf_entry(dynamic_hf_union, *pos, item->data_type, item->id_ref, item->name, item->filter_string);
if (item->hf_id != NULL) {
(*pos)++;
@ -2307,6 +2365,7 @@ update_dynamic_hf_entries_someip_parameter_structs(void) {
proto_register_field_array(proto_someip, dynamic_hf_struct, pos);
}
}
static void
update_dynamic_hf_entries_someip_parameter_unions(void) {
if (data_someip_parameter_unions != NULL) {