diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-23 20:11:06 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-24 06:53:24 +0000 |
commit | 216f06b2996c4ba86086b9d5ed226fc36621f8f6 (patch) | |
tree | ae6b174fb2361103211efe40b7cba237903aa886 /epan/proto.c | |
parent | 984f87aba78ffd1359c4b24a2c64c886f9d791c6 (diff) | |
download | wireshark-216f06b2996c4ba86086b9d5ed226fc36621f8f6.tar.gz |
Lua: Support deregister ProtoField with existing abbrev
Change-Id: Icb06792bb2662dcee6e5495359ceef420a5b4498
Reviewed-on: https://code.wireshark.org/review/10212
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'epan/proto.c')
-rw-r--r-- | epan/proto.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/epan/proto.c b/epan/proto.c index 4b10b356e4..10f436835a 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -4362,6 +4362,29 @@ hfinfo_same_name_get_prev(const header_field_info *hfinfo) return dup_hfinfo; } +static void +hfinfo_remove_fram_gpa_name_map(const header_field_info *hfinfo) +{ + if (!hfinfo->same_name_next && hfinfo->same_name_prev_id == -1) { + /* No hfinfo with the same name */ + g_hash_table_steal(gpa_name_map, hfinfo->abbrev); + return; + } + + if (hfinfo->same_name_next) { + hfinfo->same_name_next->same_name_prev_id = hfinfo->same_name_prev_id; + } + + if (hfinfo->same_name_prev_id != -1) { + header_field_info *same_name_prev = hfinfo_same_name_get_prev(hfinfo); + same_name_prev->same_name_next = hfinfo->same_name_next; + if (!hfinfo->same_name_next) { + /* It's always the latest added hfinfo which is stored in gpa_name_map */ + g_hash_table_insert(gpa_name_map, (gpointer) (same_name_prev->abbrev), same_name_prev); + } + } +} + /* -------------------------- */ const gchar * proto_custom_set(proto_tree* tree, GSList *field_ids, gint occurrence, @@ -5266,7 +5289,7 @@ proto_deregister_protocol(const char *short_name) for (i = 0; i < protocol->fields->len; i++) { hfinfo = (header_field_info *)g_ptr_array_index(protocol->fields, i); - g_hash_table_steal(gpa_name_map, hfinfo->abbrev); + hfinfo_remove_fram_gpa_name_map(hfinfo); g_ptr_array_add(deregistered_fields, gpa_hfinfo.hfi[hfinfo->id]); } g_ptr_array_free(protocol->fields, TRUE); |