proto.c: avoid dereferencing a NULL pointer

Some sub protocols do not register fields

Follow-up of gf4a521e

Change-Id: Iec3165d6204cc6acc0ec31a7266f860012463cd0
Reviewed-on: https://code.wireshark.org/review/17868
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
This commit is contained in:
Pascal Quantin 2016-09-22 20:14:25 +02:00
parent 7477e1c3b9
commit cf12e448b1
1 changed files with 16 additions and 12 deletions

View File

@ -583,7 +583,9 @@ proto_cleanup(void)
DISSECTOR_ASSERT(protocol->proto_id == hfinfo->id);
g_slice_free(header_field_info, hfinfo);
g_ptr_array_free(protocol->fields, TRUE);
if (protocol->fields) {
g_ptr_array_free(protocol->fields, TRUE);
}
g_list_free(protocol->heur_list);
protocols = g_list_remove(protocols, protocol);
g_free(protocol);
@ -5767,7 +5769,7 @@ proto_register_protocol(const char *name, const char *short_name,
protocol->short_name = short_name;
protocol->filter_name = filter_name;
/*protocol->fields = g_ptr_array_new();*/
/* Delegate until actually needed and use g_ptr_array_new_seized*/
/* Delegate until actually needed and use g_ptr_array_sized_new*/
protocol->fields = NULL;
protocol->is_enabled = TRUE; /* protocol is enabled by default */
protocol->enabled_by_default = TRUE; /* see previous comment */
@ -5815,14 +5817,16 @@ proto_deregister_protocol(const char *short_name)
g_hash_table_remove(proto_short_names, (gpointer)short_name);
g_hash_table_remove(proto_filter_names, (gpointer)protocol->filter_name);
for (i = 0; i < protocol->fields->len; i++) {
hfinfo = (header_field_info *)g_ptr_array_index(protocol->fields, i);
hfinfo_remove_from_gpa_name_map(hfinfo);
expert_deregister_expertinfo(hfinfo->abbrev);
g_ptr_array_add(deregistered_fields, gpa_hfinfo.hfi[hfinfo->id]);
if (protocol->fields) {
for (i = 0; i < protocol->fields->len; i++) {
hfinfo = (header_field_info *)g_ptr_array_index(protocol->fields, i);
hfinfo_remove_from_gpa_name_map(hfinfo);
expert_deregister_expertinfo(hfinfo->abbrev);
g_ptr_array_add(deregistered_fields, gpa_hfinfo.hfi[hfinfo->id]);
}
g_ptr_array_free(protocol->fields, TRUE);
protocol->fields = NULL;
}
g_ptr_array_free(protocol->fields, TRUE);
protocol->fields = NULL;
/* Remove this protocol from the list of known protocols */
protocols = g_list_remove(protocols, protocol);
@ -5890,7 +5894,7 @@ proto_get_first_protocol_field(const int proto_id, void **cookie)
{
protocol_t *protocol = find_protocol_by_id(proto_id);
if ((protocol == NULL) || (protocol->fields->len == 0))
if ((protocol == NULL) || (protocol->fields == NULL))
return NULL;
*cookie = GUINT_TO_POINTER(0 + 1);
@ -5905,7 +5909,7 @@ proto_get_next_protocol_field(const int proto_id, void **cookie)
i++;
if (i >= protocol->fields->len)
if ((protocol->fields == NULL) || (i >= protocol->fields->len))
return NULL;
*cookie = GUINT_TO_POINTER(i + 1);
@ -6277,7 +6281,7 @@ proto_deregister_field (const int parent, gint hf_id)
return;
proto = find_protocol_by_id (parent);
if (!proto || proto->fields->len == 0) {
if (!proto || proto->fields == NULL) {
return;
}