aboutsummaryrefslogtreecommitdiffstats
path: root/epan/proto.c
diff options
context:
space:
mode:
authorJohn Thacker <johnthacker@gmail.com>2022-05-13 20:02:01 -0400
committerJohn Thacker <johnthacker@gmail.com>2022-05-13 21:02:54 -0400
commit8a872d6142a74b320047939e54a3e45c49ea03a9 (patch)
tree533cd6148ae94f75e265db640340ad5becf1772c /epan/proto.c
parent1f1ee198f2d013f1580958ded143b6e150093324 (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.c50
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);