diff options
author | Simon Holesch <simon@holesch.de> | 2021-01-27 23:51:50 +0100 |
---|---|---|
committer | Simon Holesch <simon@holesch.de> | 2021-01-28 02:04:16 +0100 |
commit | 266e99e11ac2f6ed451b2e78a4c1d6e32b32a857 (patch) | |
tree | cc33fcd1c8b605b2ccd21ce9f12b1a0b8ea282ea /epan/dissectors/packet-dbus.c | |
parent | 96169c25f66128a72b2d6c2ccd800dbb74a24544 (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.c | 32 |
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; |