mirror of https://github.com/openssl/openssl.git
				
				
				
			QUIC APL: Correct implementation of time callback override
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21029)
This commit is contained in:
		
							parent
							
								
									754d2282cd
								
							
						
					
					
						commit
						e3e9794aa4
					
				|  | @ -93,12 +93,13 @@ __owur int ossl_quic_get_conn_close_info(SSL *ssl, | |||
|                                          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 | ||||
|  |  | |||
|  | @ -59,6 +59,21 @@ static int block_until_pred(QUIC_CONNECTION *qc, | |||
|                                               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: | ||||
|  | @ -490,17 +505,22 @@ int ossl_quic_clear(SSL *s) | |||
|     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) | ||||
|  | @ -889,7 +909,7 @@ int ossl_quic_get_event_timeout(SSL *s, struct timeval *tv, int *is_infinite) | |||
|         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; | ||||
|  | @ -1146,8 +1166,8 @@ static int create_channel(QUIC_CONNECTION *qc) | |||
|     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) | ||||
|  |  | |||
|  | @ -165,7 +165,8 @@ static int do_test(int use_thread_assist, int use_fake_time, int use_inject) | |||
|         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)))) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue