]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic-be: Add the conn object to the server SSL context
authorFrederic Lecaille <flecaille@haproxy.com>
Tue, 27 May 2025 09:29:30 +0000 (11:29 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 11 Jun 2025 16:37:34 +0000 (18:37 +0200)
The initialization of <ssl_app_data_index> SSL user data index is required
to make all the SSL sessions to QUIC servers work as this is done for TCP
servers. The conn object notably retrieve for SSL callback which are
server specific (e.g. ssl_sess_new_srv_cb()).

src/quic_ssl.c

index 3eef37ce13557c6a0acb91271c0b7a2d048f766b..2521f4bfd935c9f16486359c3b9f5fcc9b81c3c7 100644 (file)
@@ -1070,7 +1070,8 @@ int quic_ssl_set_tls_cbs(SSL *ssl)
  * Return 0 if succeeded, -1 if not. If failed, sets the ->err_code member of <qc->conn> to
  * CO_ER_SSL_NO_MEM.
  */
-static int qc_ssl_sess_init(struct quic_conn *qc, SSL_CTX *ssl_ctx, SSL **ssl)
+static int qc_ssl_sess_init(struct quic_conn *qc, SSL_CTX *ssl_ctx, SSL **ssl,
+                            struct connection *conn, int server)
 {
        int retry, ret = -1;
 
@@ -1088,6 +1089,7 @@ static int qc_ssl_sess_init(struct quic_conn *qc, SSL_CTX *ssl_ctx, SSL **ssl)
        }
 
        if (!SSL_set_ex_data(*ssl, ssl_qc_app_data_index, qc) ||
+           (!server && !SSL_set_ex_data(*ssl, ssl_app_data_index, conn)) ||
            !quic_ssl_set_tls_cbs(*ssl)) {
                SSL_free(*ssl);
                *ssl = NULL;
@@ -1178,7 +1180,7 @@ int qc_alloc_ssl_sock_ctx(struct quic_conn *qc, struct connection *conn)
        if (qc_is_listener(qc)) {
                struct bind_conf *bc = qc->li->bind_conf;
 
-               if (qc_ssl_sess_init(qc, bc->initial_ctx, &ctx->ssl) == -1)
+               if (qc_ssl_sess_init(qc, bc->initial_ctx, &ctx->ssl, NULL, 1) == -1)
                        goto err;
 #if (HA_OPENSSL_VERSION_NUMBER >= 0x10101000L) && defined(HAVE_SSL_0RTT_QUIC)
                /* Enabling 0-RTT */
@@ -1192,7 +1194,7 @@ int qc_alloc_ssl_sock_ctx(struct quic_conn *qc, struct connection *conn)
                int ssl_err;
                struct server *srv = __objt_server(ctx->conn->target);
 
-               if (qc_ssl_sess_init(qc, srv->ssl_ctx.ctx, &ctx->ssl) == -1)
+               if (qc_ssl_sess_init(qc, srv->ssl_ctx.ctx, &ctx->ssl, conn, 0) == -1)
                        goto err;
 
                if (!qc_ssl_set_quic_transport_params(ctx->ssl, qc, quic_version_1, 0))