quic_unref_port_bios(qc->port);
ossl_quic_port_free(qc->port);
qc->port = NULL;
- }
- ossl_quic_engine_free(qc->engine);
- qc->engine = NULL;
+ ossl_quic_engine_free(qc->engine);
+ qc->engine = NULL;
+ }
if (have_lock)
/* tsan doesn't like freeing locked mutexes */
ossl_crypto_mutex_unlock(qc->mutex);
#if defined(OPENSSL_THREADS)
- ossl_crypto_mutex_free(&qc->mutex);
+ if (qc->listener == NULL)
+ ossl_crypto_mutex_free(&qc->mutex);
#endif
}
* us
*/
qc_cleanup(ctx.qc, /*have_lock=*/1);
+ /* Note: SSL_free calls OPENSSL_free(qc) for us */
+
+ if (ctx.qc->listener != NULL)
+ SSL_free(&ctx.qc->listener->obj.ssl);
}
/* SSL method init */
{
QUIC_CONNECTION *qc = NULL;
+ if (!SSL_up_ref(&ql->obj.ssl)) {
+ QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
+ goto err;
+ }
+
if ((qc = OPENSSL_zalloc(sizeof(*qc))) == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_CRYPTO_LIB, NULL);
+ SSL_free(&ql->obj.ssl);
goto err;
}
SSL_TYPE_QUIC_CONNECTION,
&ql->obj.ssl, NULL, NULL)) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
+ SSL_free(&ql->obj.ssl);
goto err;
}