QUIC: fix wrong dissection of ODCIL

Since draft 17, IETF QUIC retry packets carry the Original Destination Connection ID Length (ODCIL)
in the four least-significant bits of the first byte.
However Wireshark's QUIC dissector expects the ODCIL to be after the source connection ID,
which was the behaviour before draft 17, which results in incorrect dissection

Issue reported by Jeremy Lainé

Bug: 15764
Change-Id: I7c6ed2988a0b0ab3f4dfe6de9f9571ae522148cf
Reviewed-on: https://code.wireshark.org/review/33116
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Alexis La Goutte 2019-05-08 19:33:58 +02:00 committed by Anders Broman
parent ff7f584e26
commit 405439d41d
1 changed files with 5 additions and 6 deletions

View File

@ -1821,7 +1821,7 @@ dissect_quic_long_header_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *q
return offset;
}
/* Retry Packet dissection for draft -13 and newer. */
/* Retry Packet dissection */
static int
dissect_quic_retry_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *quic_tree,
quic_datagram *dgram_info _U_, quic_packet_info_t *quic_packet)
@ -1833,16 +1833,15 @@ dissect_quic_retry_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *quic_tr
guint retry_token_len;
proto_tree_add_item(quic_tree, hf_quic_long_packet_type, tvb, offset, 1, ENC_NA);
offset += 1;
col_set_str(pinfo->cinfo, COL_INFO, "Retry");
offset = dissect_quic_long_header_common(tvb, pinfo, quic_tree, offset, quic_packet, &version, &dcid, &scid);
proto_tree_add_item_ret_uint(quic_tree, hf_quic_odcil, tvb, offset, 1, ENC_NA, &odcil);
if (odcil) {
odcil += 3;
}
offset += 1;
col_set_str(pinfo->cinfo, COL_INFO, "Retry");
offset = dissect_quic_long_header_common(tvb, pinfo, quic_tree, offset, quic_packet, &version, &dcid, &scid);
proto_tree_add_item(quic_tree, hf_quic_odcid, tvb, offset, odcil, ENC_NA);
offset += odcil;
retry_token_len = tvb_reported_length_remaining(tvb, offset);