size_t info_len);
/*
- * Used to override ossl_time_now() for debug purposes. Must be called before
+ * Used to override ossl_time_now() for debug purposes. While this may be
+ * overridden at any time, expect strange results if you change it after
* connecting.
*/
-void ossl_quic_conn_set_override_now_cb(SSL *s,
- OSSL_TIME (*now_cb)(void *arg),
- void *now_cb_arg);
+int ossl_quic_conn_set_override_now_cb(SSL *s,
+ OSSL_TIME (*now_cb)(void *arg),
+ void *now_cb_arg);
/*
* Condvar waiting in the assist thread doesn't support time faking as it relies
qc->mutex);
}
+static OSSL_TIME get_time(QUIC_CONNECTION *qc)
+{
+ if (qc->override_now_cb != NULL)
+ return qc->override_now_cb(qc->override_now_cb_arg);
+ else
+ return ossl_time_now();
+}
+
+static OSSL_TIME get_time_cb(void *arg)
+{
+ QUIC_CONNECTION *qc = arg;
+
+ return get_time(qc);
+}
+
/*
* QCTX is a utility structure which provides information we commonly wish to
* unwrap upon an API call being dispatched to us, namely:
return 1;
}
-void ossl_quic_conn_set_override_now_cb(SSL *s,
- OSSL_TIME (*now_cb)(void *arg),
- void *now_cb_arg)
+int ossl_quic_conn_set_override_now_cb(SSL *s,
+ OSSL_TIME (*now_cb)(void *arg),
+ void *now_cb_arg)
{
QCTX ctx;
if (!expect_quic(s, &ctx))
- return;
+ return 0;
+
+ quic_lock(ctx.qc);
ctx.qc->override_now_cb = now_cb;
ctx.qc->override_now_cb_arg = now_cb_arg;
+
+ quic_unlock(ctx.qc);
+ return 1;
}
void ossl_quic_conn_force_assist_thread_wake(SSL *s)
return 1;
}
- *tv = ossl_time_to_timeval(ossl_time_subtract(deadline, ossl_time_now()));
+ *tv = ossl_time_to_timeval(ossl_time_subtract(deadline, get_time(ctx.qc)));
*is_infinite = 0;
quic_unlock(ctx.qc);
return 1;
args.is_server = qc->as_server;
args.tls = qc->tls;
args.mutex = qc->mutex;
- args.now_cb = qc->override_now_cb;
- args.now_cb_arg = qc->override_now_cb_arg;
+ args.now_cb = get_time_cb;
+ args.now_cb_arg = qc;
qc->ch = ossl_quic_channel_new(&args);
if (qc->ch == NULL)
goto err;
if (use_fake_time)
- ossl_quic_conn_set_override_now_cb(c_ssl, fake_now, NULL);
+ if (!TEST_true(ossl_quic_conn_set_override_now_cb(c_ssl, fake_now, NULL)))
+ goto err;
/* 0 is a success for SSL_set_alpn_protos() */
if (!TEST_false(SSL_set_alpn_protos(c_ssl, alpn, sizeof(alpn))))