Some Pref <-> Decode As bugfixes.

1. If a deprecated port preference is found, populate the new port preference with the value
2. Mark preferences as changed to trigger preference callback at startup.

Change-Id: Ic271841686617e847d2e0ed8800bbb0fa874df47
Reviewed-on: https://code.wireshark.org/review/18274
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Michael Mann 2016-10-18 09:14:35 -04:00
parent 09b43591a1
commit 739bdfb45f
2 changed files with 33 additions and 26 deletions

View File

@ -181,6 +181,7 @@ read_set_decode_as_entries(gchar *key, const gchar *value,
dissector_handle_t handle;
ftenum_t selector_type;
pref_t* pref_value;
module_t *module;
selector_type = dissector_table_get_type(sub_dissectors);
@ -206,7 +207,8 @@ read_set_decode_as_entries(gchar *key, const gchar *value,
}
/* Now apply the value data back to dissector table preference */
pref_value = prefs_find_preference(prefs_find_module(proto_get_protocol_filter_name(dissector_handle_get_protocol_index(handle))), values[0]);
module = prefs_find_module(proto_get_protocol_filter_name(dissector_handle_get_protocol_index(handle)));
pref_value = prefs_find_preference(module, values[0]);
if (pref_value != NULL) {
switch(pref_value->type)
{
@ -215,9 +217,11 @@ read_set_decode_as_entries(gchar *key, const gchar *value,
preference only supports a single value. This leads to a "last port for
dissector in Decode As wins" */
*pref_value->varp.uint = (guint)long_value;
module->prefs_changed = TRUE;
break;
case PREF_DECODE_AS_RANGE:
range_add_value(pref_value->varp.range, (guint)long_value);
module->prefs_changed = TRUE;
break;
default:
/* XXX - Worth asserting over? */

View File

@ -4208,6 +4208,8 @@ deprecated_port_pref(gchar *pref_name, const gchar *value)
guint uval;
dissector_table_t sub_dissectors;
dissector_handle_t handle, tpkt_handle;
module_t *module;
pref_t *pref;
for (i = 0; i < sizeof(port_prefs)/sizeof(struct port_pref_name); i++)
{
@ -4218,6 +4220,14 @@ deprecated_port_pref(gchar *pref_name, const gchar *value)
if (p == value || *p != '\0')
return FALSE; /* number was bad */
module = prefs_find_module((gchar*)port_prefs[i].module_name);
pref = prefs_find_preference(module, port_prefs[i].table_name);
if (pref != NULL)
{
module->prefs_changed = TRUE;
*pref->varp.uint = uval;
}
/* If the value is zero, it wouldn't add to the Decode As tables */
if (uval != 0)
{
@ -4239,25 +4249,15 @@ deprecated_port_pref(gchar *pref_name, const gchar *value)
{
if (strcmp(pref_name, port_range_prefs[i].pref_name) == 0)
{
range_t *newrange;
guint32 range_i, range_j;
guint32 max_value = 0;
sub_dissectors = find_dissector_table(port_range_prefs[i].table_name);
if (sub_dissectors != NULL) {
/* Max value is based on datatype of dissector table */
switch (dissector_table_get_type(sub_dissectors)) {
case FT_UINT8:
max_value = 0xFF;
break;
case FT_UINT16:
max_value = 0xFFFF;
break;
case FT_UINT24:
max_value = 0xFFFFFF;
break;
case FT_UINT32:
max_value = 0xFFFFFFFF;
break;
default:
@ -4265,26 +4265,29 @@ deprecated_port_pref(gchar *pref_name, const gchar *value)
g_assert_not_reached();
}
if (range_convert_str_work(&newrange, value, max_value,
TRUE) != CVT_NO_ERROR) {
return FALSE; /* number was bad */
}
module = prefs_find_module((gchar*)port_range_prefs[i].module_name);
pref = prefs_find_preference(module, port_range_prefs[i].table_name);
if (pref != NULL)
{
if (!prefs_set_range_value(pref, value, &module->prefs_changed))
{
return FALSE; /* number was bad */
}
handle = dissector_table_get_dissector_handle(sub_dissectors, (gchar*)port_range_prefs[i].module_name);
if (handle != NULL) {
handle = dissector_table_get_dissector_handle(sub_dissectors, (gchar*)port_range_prefs[i].module_name);
if (handle != NULL) {
for (range_i = 0; range_i < newrange->nranges; range_i++) {
for (range_j = newrange->ranges[range_i].low; range_j < newrange->ranges[range_i].high; range_j++) {
dissector_change_uint(port_range_prefs[i].table_name, range_j, handle);
decode_build_reset_list(port_range_prefs[i].table_name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER(range_j), NULL, NULL);
for (range_i = 0; range_i < (*pref->varp.range)->nranges; range_i++) {
for (range_j = (*pref->varp.range)->ranges[range_i].low; range_j < (*pref->varp.range)->ranges[range_i].high; range_j++) {
dissector_change_uint(port_range_prefs[i].table_name, range_j, handle);
decode_build_reset_list(port_range_prefs[i].table_name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER(range_j), NULL, NULL);
}
dissector_change_uint(port_range_prefs[i].table_name, (*pref->varp.range)->ranges[range_i].high, handle);
decode_build_reset_list(port_range_prefs[i].table_name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER((*pref->varp.range)->ranges[range_i].high), NULL, NULL);
}
dissector_change_uint(port_range_prefs[i].table_name, newrange->ranges[range_i].high, handle);
decode_build_reset_list(port_range_prefs[i].table_name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER(newrange->ranges[range_i].high), NULL, NULL);
}
}
g_free(newrange);
}
return TRUE;