haproxy/include/haproxy/quic_tp.h
Frédéric Lécaille b971696296 BUG/MINOR: quic: Possible crash when dumping version information
->others member of tp_version_information structure pointed to a buffer in the
TLS stack used to parse the transport parameters. There is no garantee that this
buffer is available until the connection is released.

Do not dump the available versions selected by the client anymore, but displayed the
chosen one (selected by the client for this connection) and the negotiated one.

Must be backported to 2.7 and 2.6.
2023-05-10 13:26:37 +02:00

118 lines
4.0 KiB
C

#ifndef _HAPROXY_QUIC_TP_H
#define _HAPROXY_QUIC_TP_H
#ifdef USE_QUIC
#ifndef USE_OPENSSL
#error "Must define USE_OPENSSL"
#endif
#include <haproxy/chunk.h>
#include <haproxy/quic_conn-t.h>
#include <haproxy/quic_tp-t.h>
void quic_transport_params_init(struct quic_transport_params *p, int server);
int quic_transport_params_encode(unsigned char *buf,
const unsigned char *end,
struct quic_transport_params *p,
const struct quic_version *chosen_version,
int server);
int quic_transport_params_store(struct quic_conn *conn, int server,
const unsigned char *buf,
const unsigned char *end);
int qc_lstnr_params_init(struct quic_conn *qc,
const struct quic_transport_params *listener_params,
const unsigned char *stateless_reset_token,
const unsigned char *dcid, size_t dcidlen,
const unsigned char *scid, size_t scidlen,
const struct quic_cid *token_odcid);
/* Dump <cid> transport parameter connection ID value if present (non null length).
* Used only for debugging purposes.
*/
static inline void quic_tp_cid_dump(struct buffer *buf,
const struct tp_cid *cid)
{
int i;
for (i = 0; i < cid->len; i++)
chunk_appendf(buf, "%02x", cid->data[i]);
}
static inline void quic_tp_version_info_dump(struct buffer *b,
const struct tp_version_information *tp, int local)
{
if (!tp->chosen)
return;
chunk_appendf(b, " versions:chosen=0x%08x", tp->chosen);
if (tp->negotiated_version)
chunk_appendf(b, ",negotiated=0x%08x", tp->negotiated_version->num);
}
static inline void quic_transport_params_dump(struct buffer *b,
const struct quic_conn *qc,
const struct quic_transport_params *p)
{
int local = p == &qc->rx.params;
if (p->original_destination_connection_id.len) {
chunk_appendf(b, " odcid=");
quic_tp_cid_dump(b, &p->original_destination_connection_id);
}
chunk_appendf(b, " iscid=");
quic_tp_cid_dump(b, &p->initial_source_connection_id);
if (p->retry_source_connection_id.len) {
chunk_appendf(b, " rscid=");
quic_tp_cid_dump(b, &p->retry_source_connection_id);
}
chunk_appendf(b, "\n");
chunk_appendf(b, " midle_timeout=%llums", (ull)p->max_idle_timeout);
chunk_appendf(b, " mudp_payload_sz=%llu", (ull)p->max_udp_payload_size);
chunk_appendf(b, " ack_delay_exp=%llu", (ull)p->ack_delay_exponent);
chunk_appendf(b, " mack_delay=%llums", (ull)p->max_ack_delay);
chunk_appendf(b, " act_cid_limit=%llu\n", (ull)p->active_connection_id_limit);
chunk_appendf(b, " md=%llu", (ull)p->initial_max_data);
chunk_appendf(b, " msd_bidi_l=%llu",
(ull)p->initial_max_stream_data_bidi_local);
chunk_appendf(b, " msd_bidi_r=%llu",
(ull)p->initial_max_stream_data_bidi_remote);
chunk_appendf(b, " msd_uni=%llu",
(ull)p->initial_max_stream_data_uni);
chunk_appendf(b, " ms_bidi=%llu", (ull)p->initial_max_streams_bidi);
chunk_appendf(b, " ms_uni=%llu\n", (ull)p->initial_max_streams_uni);
if (p->disable_active_migration || p->with_stateless_reset_token ||
p->with_preferred_address) {
int prev = 0;
chunk_appendf(b, " (");
if (p->disable_active_migration) {
if (prev)
chunk_appendf(b, ",");
prev = 1;
chunk_appendf(b, "no_act_migr");
}
if (p->with_stateless_reset_token) {
if (prev)
chunk_appendf(b, ",");
prev = 1;
chunk_appendf(b, "stless_rst_tok");
}
if (p->with_preferred_address) {
if (prev)
chunk_appendf(b, ",");
prev = 1;
chunk_appendf(b, "pref_addr");
}
chunk_appendf(b, ")");
}
quic_tp_version_info_dump(b, &p->version_information, local);
}
#endif /* USE_QUIC */
#endif /* _HAPROXY_QUIC_TP_H */