diff options
author | John Thacker <johnthacker@gmail.com> | 2022-05-13 20:02:01 -0400 |
---|---|---|
committer | John Thacker <johnthacker@gmail.com> | 2022-05-13 21:02:54 -0400 |
commit | 8a872d6142a74b320047939e54a3e45c49ea03a9 (patch) | |
tree | 533cd6148ae94f75e265db640340ad5becf1772c /epan/proto.c | |
parent | 1f1ee198f2d013f1580958ded143b6e150093324 (diff) |
proto: Add support for BASE_SPECIAL_VALS to fields with bitmasks
Add support for BASE_SPECIAL_VALS to fill_label_bitfield[64], for
fields with a nonzero bitmask, using the same logic as
fill_label_number[64].
There's at least one dissector (packet-ipmi-se.c) that was trying
to use this already, but silently had no effect.
Diffstat (limited to 'epan/proto.c')
-rw-r--r-- | epan/proto.c | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/epan/proto.c b/epan/proto.c index 6cc65e7beb..ebb4f05aaa 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -9590,13 +9590,28 @@ fill_label_bitfield(field_info *fi, gchar *label_str, gboolean is_signed) label_fill(label_str, bitfield_byte_length, hfinfo, tmp); } else if (hfinfo->strings) { - const char *val_str = hf_try_val_to_str_const(value, hfinfo, "Unknown"); + const char *val_str = hf_try_val_to_str(value, hfinfo); out = hfinfo_number_vals_format(hfinfo, buf, value); - if (out == NULL) /* BASE_NONE so don't put integer in descr */ - label_fill(label_str, bitfield_byte_length, hfinfo, val_str); - else - label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + if (hfinfo->display & BASE_SPECIAL_VALS) { + /* + * Unique values only display value_string string + * if there is a match. Otherwise it's just a number + */ + if (val_str) { + label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + } else { + label_fill(label_str, bitfield_byte_length, hfinfo, out); + } + } else { + if (val_str == NULL) + val_str = "Unknown"; + + if (out == NULL) /* BASE_NONE so don't put integer in descr */ + label_fill(label_str, bitfield_byte_length, hfinfo, val_str); + else + label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + } } else { out = hfinfo_number_value_format(hfinfo, buf, value); @@ -9650,13 +9665,28 @@ fill_label_bitfield64(field_info *fi, gchar *label_str, gboolean is_signed) label_fill(label_str, bitfield_byte_length, hfinfo, tmp); } else if (hfinfo->strings) { - const char *val_str = hf_try_val64_to_str_const(value, hfinfo, "Unknown"); + const char *val_str = hf_try_val64_to_str(value, hfinfo); out = hfinfo_number_vals_format64(hfinfo, buf, value); - if (out == NULL) /* BASE_NONE so don't put integer in descr */ - label_fill(label_str, bitfield_byte_length, hfinfo, val_str); - else - label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + if (hfinfo->display & BASE_SPECIAL_VALS) { + /* + * Unique values only display value_string string + * if there is a match. Otherwise it's just a number + */ + if (val_str) { + label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + } else { + label_fill(label_str, bitfield_byte_length, hfinfo, out); + } + } else { + if (val_str == NULL) + val_str = "Unknown"; + + if (out == NULL) /* BASE_NONE so don't put integer in descr */ + label_fill(label_str, bitfield_byte_length, hfinfo, val_str); + else + label_fill_descr(label_str, bitfield_byte_length, hfinfo, val_str, out); + } } else { out = hfinfo_number_value_format64(hfinfo, buf, value); |