aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dbus.c
diff options
context:
space:
mode:
authorSimon Holesch <simon@holesch.de>2021-01-27 23:51:50 +0100
committerSimon Holesch <simon@holesch.de>2021-01-28 02:04:16 +0100
commit266e99e11ac2f6ed451b2e78a4c1d6e32b32a857 (patch)
treecc33fcd1c8b605b2ccd21ce9f12b1a0b8ea282ea /epan/dissectors/packet-dbus.c
parent96169c25f66128a72b2d6c2ccd800dbb74a24544 (diff)
D-Bus: Handle variants with empty signatures
This triggered a dissector bug: epan/dissectors/packet-dbus.c:796: failed assertion "DISSECTOR_ASSERT_NOT_REACHED" Fixes #17176
Diffstat (limited to 'epan/dissectors/packet-dbus.c')
-rw-r--r--epan/dissectors/packet-dbus.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/epan/dissectors/packet-dbus.c b/epan/dissectors/packet-dbus.c
index 37112d54ae..dfd23cf660 100644
--- a/epan/dissectors/packet-dbus.c
+++ b/epan/dissectors/packet-dbus.c
@@ -746,21 +746,25 @@ reader_next(dbus_type_reader_t *reader, int hf, int ett, dbus_val_t *value) {
const char *variant_signature = add_dbus_string(packet, hf_dbus_type_variant_signature, 1);
value->string = variant_signature;
if (variant_signature && is_dbus_signature_valid(variant_signature)) {
- dbus_type_reader_t *child = wmem_new(wmem_packet_scope(), dbus_type_reader_t);
- *child = (dbus_type_reader_t){
- .packet = reader->packet,
- .signature = variant_signature,
- .level = reader->level + 1,
- .is_in_variant = TRUE,
- .is_basic_variant = is_basic_type(*variant_signature)
- && *(variant_signature + 1) == '\0',
- .container = variant,
- .parent = reader,
- };
- if (reader->is_in_dict_entry && child->is_basic_variant) {
- reader->is_basic_dict_entry = TRUE;
+ if (variant_signature[0] != '\0') {
+ dbus_type_reader_t *child = wmem_new(wmem_packet_scope(), dbus_type_reader_t);
+ *child = (dbus_type_reader_t){
+ .packet = reader->packet,
+ .signature = variant_signature,
+ .level = reader->level + 1,
+ .is_in_variant = TRUE,
+ .is_basic_variant = is_basic_type(*variant_signature)
+ && *(variant_signature + 1) == '\0',
+ .container = variant,
+ .parent = reader,
+ };
+ if (reader->is_in_dict_entry && child->is_basic_variant) {
+ reader->is_basic_dict_entry = TRUE;
+ }
+ reader = child;
+ } else {
+ ptvcursor_pop_subtree(packet->cursor);
}
- reader = child;
} else {
add_expert(packet, &ei_dbus_type_variant_signature_invalid);
err = 1;