{
QUIC_DOMAIN *qd = NULL;
QUIC_ENGINE_ARGS engine_args = {0};
+ uint64_t domain_flags;
+
+ domain_flags = ctx->domain_flags;
+ if ((flags & (SSL_DOMAIN_FLAG_SINGLE_THREAD
+ | SSL_DOMAIN_FLAG_MULTI_THREAD
+ | SSL_DOMAIN_FLAG_THREAD_ASSISTED)) != 0)
+ domain_flags = flags;
+ else
+ domain_flags = ctx->domain_flags | flags;
+
+ if (!ossl_adjust_domain_flags(domain_flags, &domain_flags))
+ return NULL;
if ((qd = OPENSSL_zalloc(sizeof(*qd))) == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_CRYPTO_LIB, NULL);
#if defined(OPENSSL_THREADS)
engine_args.mutex = qd->mutex;
#endif
- if (need_notifier_for_domain_flags(ctx->domain_flags))
+ if (need_notifier_for_domain_flags(domain_flags))
engine_args.reactor_flags |= QUIC_REACTOR_FLAG_USE_NOTIFIER;
if ((qd->engine = ossl_quic_engine_new(&engine_args)) == NULL) {
qd->engine, NULL))
goto err;
+ ossl_quic_obj_set_domain_flags(&qd->obj, domain_flags);
return &qd->obj.ssl;
err:
#endif
}
-int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags)
+int ossl_adjust_domain_flags(uint64_t domain_flags, uint64_t *p_domain_flags)
{
-#ifndef OPENSSL_NO_QUIC
- if (IS_QUIC_CTX(ctx)) {
- if ((domain_flags & ~OSSL_QUIC_SUPPORTED_DOMAIN_FLAGS) != 0) {
- ERR_raise_data(ERR_LIB_SSL, ERR_R_UNSUPPORTED,
- "unsupported domain flag requested");
- return 0;
- }
+ if ((domain_flags & ~OSSL_QUIC_SUPPORTED_DOMAIN_FLAGS) != 0) {
+ ERR_raise_data(ERR_LIB_SSL, ERR_R_UNSUPPORTED,
+ "unsupported domain flag requested");
+ return 0;
+ }
- if ((domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0)
- domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
+ if ((domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0)
+ domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
- if ((domain_flags & (SSL_DOMAIN_FLAG_MULTI_THREAD
- | SSL_DOMAIN_FLAG_SINGLE_THREAD)) == 0)
- domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
+ if ((domain_flags & (SSL_DOMAIN_FLAG_MULTI_THREAD
+ | SSL_DOMAIN_FLAG_SINGLE_THREAD)) == 0)
+ domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
- if ((domain_flags & SSL_DOMAIN_FLAG_SINGLE_THREAD) != 0
- && (domain_flags & SSL_DOMAIN_FLAG_MULTI_THREAD) != 0) {
- ERR_raise_data(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT,
- "mutually exclusive domain flags specified");
- return 0;
- }
+ if ((domain_flags & SSL_DOMAIN_FLAG_SINGLE_THREAD) != 0
+ && (domain_flags & SSL_DOMAIN_FLAG_MULTI_THREAD) != 0) {
+ ERR_raise_data(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT,
+ "mutually exclusive domain flags specified");
+ return 0;
+ }
- /*
- * Note: We treat MULTI_THREAD as a no-op in non-threaded builds, but
- * not THREAD_ASSISTED.
- */
+ /*
+ * Note: We treat MULTI_THREAD as a no-op in non-threaded builds, but
+ * not THREAD_ASSISTED.
+ */
# ifndef OPENSSL_THREADS
- if ((domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0) {
- ERR_raise_data(ERR_LIB_SSL, ERR_R_UNSUPPORTED,
- "thread assisted mode not available in this build");
- return 0;
- }
+ if ((domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0) {
+ ERR_raise_data(ERR_LIB_SSL, ERR_R_UNSUPPORTED,
+ "thread assisted mode not available in this build");
+ return 0;
+ }
# endif
+ *p_domain_flags = domain_flags;
+ return 1;
+}
+
+int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags)
+{
+#ifndef OPENSSL_NO_QUIC
+ if (IS_QUIC_CTX(ctx)) {
+ if (!ossl_adjust_domain_flags(domain_flags, &domain_flags))
+ return 0;
+
ctx->domain_flags = domain_flags;
return 1;
}