| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2022-05-03 18:52:38 +08:00
										 |  |  |  * Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:05:25 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:20:24 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-26 19:40:15 +08:00
										 |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | # include <windows.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <openssl/async.h>
 | 
					
						
							|  |  |  | #include <openssl/crypto.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int ctr = 0; | 
					
						
							|  |  |  | static ASYNC_JOB *currjob = NULL; | 
					
						
							| 
									
										
										
										
											2022-02-25 02:13:25 +08:00
										 |  |  | static int custom_alloc_used = 0; | 
					
						
							|  |  |  | static int custom_free_used = 0; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int only_pause(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int add_two(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ctr++; | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  |     ctr++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 2; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int save_current(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     currjob = ASYNC_get_current_job(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  | static int change_deflt_libctx(void *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     OSSL_LIB_CTX *libctx = OSSL_LIB_CTX_new(); | 
					
						
							|  |  |  |     OSSL_LIB_CTX *oldctx, *tmpctx; | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     int ret = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (libctx == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     oldctx = OSSL_LIB_CTX_set0_default(libctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check the libctx is set up as we expect */ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     tmpctx = OSSL_LIB_CTX_set0_default(oldctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     if (tmpctx != libctx) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Set it back again to continue to use our own libctx */ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     oldctx = OSSL_LIB_CTX_set0_default(libctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check the libctx is set up as we expect */ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     tmpctx = OSSL_LIB_CTX_set0_default(oldctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     if (tmpctx != libctx) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     OSSL_LIB_CTX_free(libctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  | #define MAGIC_WAIT_FD   ((OSSL_ASYNC_FD)99)
 | 
					
						
							|  |  |  | static int waitfd(void *args) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_JOB *job; | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX *waitctx; | 
					
						
							|  |  |  |     job = ASYNC_get_current_job(); | 
					
						
							|  |  |  |     if (job == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     waitctx = ASYNC_get_wait_ctx(job); | 
					
						
							|  |  |  |     if (waitctx == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* First case: no fd added or removed */ | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Second case: one fd added */ | 
					
						
							| 
									
										
										
										
											2016-06-29 06:18:50 +08:00
										 |  |  |     if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     ASYNC_pause_job(); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |     /* Third case: all fd removed */ | 
					
						
							|  |  |  |     if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Last case: fd added and immediately removed */ | 
					
						
							|  |  |  |     if (!ASYNC_WAIT_CTX_set_wait_fd(waitctx, waitctx, MAGIC_WAIT_FD, NULL, NULL)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     if (!ASYNC_WAIT_CTX_clear_fd(waitctx, waitctx)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | static int blockpause(void *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_block_pause(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  |     ASYNC_unblock_pause(); | 
					
						
							|  |  |  |     ASYNC_pause_job(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_init_thread(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job1 = NULL, *job2 = NULL, *job3 = NULL; | 
					
						
							|  |  |  |     int funcret1, funcret2, funcret3; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(2, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_NO_JOBS | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job1, waitctx, &funcret1, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job2, waitctx, &funcret2, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job3, waitctx, &funcret3, only_pause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret1 != 1 | 
					
						
							|  |  |  |             || funcret2 != 1 | 
					
						
							|  |  |  |             || funcret3 != 1) { | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         fprintf(stderr, "test_ASYNC_init_thread() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-06 04:41:01 +08:00
										 |  |  | static int test_callback(void *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printf("callback test pass\n"); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_ASYNC_callback_status(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							|  |  |  |     int set_arg = 100; | 
					
						
							|  |  |  |     ASYNC_callback_fn get_callback; | 
					
						
							|  |  |  |     void *get_arg; | 
					
						
							|  |  |  |     int set_status = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							|  |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_set_callback(waitctx, test_callback, (void*)&set_arg) | 
					
						
							|  |  |  |                != 1 | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_get_callback(waitctx, &get_callback, &get_arg) | 
					
						
							|  |  |  |                != 1 | 
					
						
							|  |  |  |             || test_callback != get_callback | 
					
						
							|  |  |  |             || get_arg != (void*)&set_arg | 
					
						
							|  |  |  |             || (*get_callback)(get_arg) != 1 | 
					
						
							|  |  |  |             || ASYNC_WAIT_CTX_set_status(waitctx, set_status) != 1 | 
					
						
							|  |  |  |             || set_status != ASYNC_WAIT_CTX_get_status(waitctx)) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_callback_status() failed\n"); | 
					
						
							|  |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							|  |  |  |         ASYNC_cleanup_thread(); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							|  |  |  |     ASYNC_cleanup_thread(); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_start_job(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctr = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || ctr != 1 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, add_two, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_FINISH | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || ctr != 2 | 
					
						
							|  |  |  |             || funcret != 2) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_start_job() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_get_current_job(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     currjob = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							|  |  |  |             || currjob != job | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, save_current, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_get_current_job() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_WAIT_CTX_get_all_fds(void) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							| 
									
										
										
										
											2015-11-13 19:22:21 +08:00
										 |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     OSSL_ASYNC_FD fd = OSSL_BAD_ASYNC_FD, delfd = OSSL_BAD_ASYNC_FD; | 
					
						
							|  |  |  |     size_t numfds, numdelfds; | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |                /* On first run we're not expecting any wait fds */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							|  |  |  |                /* On second run we're expecting one added fd */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 1 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, &fd, &numfds) | 
					
						
							|  |  |  |             || fd != MAGIC_WAIT_FD | 
					
						
							|  |  |  |             || (fd = OSSL_BAD_ASYNC_FD, 0) /* Assign to something else */ | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                                                &numdelfds) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || numfds != 1 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, &fd, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || fd != MAGIC_WAIT_FD | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                /* On third run we expect one deleted fd */ | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 1 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, &delfd, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || delfd != MAGIC_WAIT_FD | 
					
						
							| 
									
										
										
										
											2017-01-26 11:17:54 +08:00
										 |  |  |             /* On last run we are not expecting any wait fd */ | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, waitfd, NULL, 0) | 
					
						
							|  |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_all_fds(waitctx, NULL, &numfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || !ASYNC_WAIT_CTX_get_changed_fds(waitctx, NULL, &numfds, NULL, | 
					
						
							|  |  |  |                                                &numdelfds) | 
					
						
							|  |  |  |             || numfds != 0 | 
					
						
							|  |  |  |             || numdelfds != 0 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_get_wait_fd() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 23:09:50 +08:00
										 |  |  | static int test_ASYNC_block_pause(void) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							| 
									
										
										
										
											2016-02-29 21:07:28 +08:00
										 |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     if (       !ASYNC_init_thread(1, 0) | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || (waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |                 != ASYNC_PAUSE | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, blockpause, NULL, 0) | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |                 != ASYNC_FINISH | 
					
						
							|  |  |  |             || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, "test_ASYNC_block_pause() failed\n"); | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |         ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |         ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-25 23:28:57 +08:00
										 |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2016-02-09 00:43:03 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2015-11-12 18:42:08 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  | static int test_ASYNC_start_job_ex(void) | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ASYNC_JOB *job = NULL; | 
					
						
							|  |  |  |     int funcret; | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX *waitctx = NULL; | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     OSSL_LIB_CTX *libctx = OSSL_LIB_CTX_new(); | 
					
						
							|  |  |  |     OSSL_LIB_CTX *oldctx, *tmpctx, *globalctx; | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     int ret = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (libctx == NULL) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() failed to create libctx\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     globalctx = oldctx = OSSL_LIB_CTX_set0_default(libctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ((waitctx = ASYNC_WAIT_CTX_new()) == NULL | 
					
						
							|  |  |  |             || ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, | 
					
						
							|  |  |  |                                NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_PAUSE) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() failed to start job\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Reset the libctx temporarily to find out what it is*/ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     tmpctx = OSSL_LIB_CTX_set0_default(oldctx); | 
					
						
							|  |  |  |     oldctx = OSSL_LIB_CTX_set0_default(tmpctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     if (tmpctx != libctx) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() failed - unexpected libctx\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_PAUSE) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() - restarting job failed\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Reset the libctx and continue with the global default libctx */ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     tmpctx = OSSL_LIB_CTX_set0_default(oldctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     if (tmpctx != libctx) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() failed - unexpected libctx\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (ASYNC_start_job(&job, waitctx, &funcret, change_deflt_libctx, NULL, 0) | 
					
						
							|  |  |  |                != ASYNC_FINISH | 
					
						
							|  |  |  |                 || funcret != 1) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() - finishing job failed\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Reset the libctx temporarily to find out what it is*/ | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     tmpctx = OSSL_LIB_CTX_set0_default(libctx); | 
					
						
							|  |  |  |     OSSL_LIB_CTX_set0_default(tmpctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     if (tmpctx != globalctx) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2020-09-24 17:42:23 +08:00
										 |  |  |                 "test_ASYNC_start_job_ex() failed - global libctx check failed\n"); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = 1; | 
					
						
							|  |  |  |  err: | 
					
						
							|  |  |  |     ASYNC_WAIT_CTX_free(waitctx); | 
					
						
							| 
									
										
										
										
											2021-09-28 23:23:44 +08:00
										 |  |  |     ASYNC_cleanup_thread(); | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  |     OSSL_LIB_CTX_free(libctx); | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-25 02:13:25 +08:00
										 |  |  | static void *test_alloc_stack(size_t *num) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     custom_alloc_used = 1; | 
					
						
							|  |  |  |     return OPENSSL_malloc(*num); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void test_free_stack(void *addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     custom_free_used = 1; | 
					
						
							|  |  |  |     OPENSSL_free(addr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_ASYNC_set_mem_functions(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASYNC_stack_alloc_fn alloc_fn; | 
					
						
							|  |  |  |     ASYNC_stack_free_fn free_fn; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Not all platforms support this */ | 
					
						
							|  |  |  |     if (ASYNC_set_mem_functions(test_alloc_stack, test_free_stack) == 0) return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASYNC_get_mem_functions(&alloc_fn, &free_fn); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ((alloc_fn != test_alloc_stack) || (free_fn != test_free_stack)) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							|  |  |  |                 "test_ASYNC_set_mem_functions() - setting and retrieving custom allocators failed\n"); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!ASYNC_init_thread(1, 1)) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							|  |  |  |                 "test_ASYNC_set_mem_functions() - failed initialising ctx pool\n"); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ASYNC_cleanup_thread(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!custom_alloc_used || !custom_free_used) { | 
					
						
							|  |  |  |          fprintf(stderr, | 
					
						
							|  |  |  |                 "test_ASYNC_set_mem_functions() - custom allocation functions not used\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  | int main(int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-16 18:38:39 +08:00
										 |  |  |     if (!ASYNC_is_capable()) { | 
					
						
							|  |  |  |         fprintf(stderr, | 
					
						
							|  |  |  |                 "OpenSSL build is not ASYNC capable - skipping async tests\n"); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2019-12-05 02:15:08 +08:00
										 |  |  |         if (!test_ASYNC_init_thread() | 
					
						
							| 
									
										
										
										
											2018-11-06 04:41:01 +08:00
										 |  |  |                 || !test_ASYNC_callback_status() | 
					
						
							| 
									
										
										
										
											2016-03-16 18:38:39 +08:00
										 |  |  |                 || !test_ASYNC_start_job() | 
					
						
							|  |  |  |                 || !test_ASYNC_get_current_job() | 
					
						
							|  |  |  |                 || !test_ASYNC_WAIT_CTX_get_all_fds() | 
					
						
							| 
									
										
										
										
											2020-06-26 18:02:29 +08:00
										 |  |  |                 || !test_ASYNC_block_pause() | 
					
						
							| 
									
										
										
										
											2022-02-25 02:13:25 +08:00
										 |  |  |                 || !test_ASYNC_start_job_ex() | 
					
						
							|  |  |  |                 || !test_ASYNC_set_mem_functions()) { | 
					
						
							| 
									
										
										
										
											2016-03-16 18:38:39 +08:00
										 |  |  |             return 1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-10-06 02:41:58 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     printf("PASS\n"); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } |