TEST: Break out the local dynamic loading code from shlibloadtest.c The result is "simpledynamic.c", or "sd" for short. Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> (Merged from https://github.com/openssl/openssl/pull/13507)
diff --git a/test/shlibloadtest.c b/test/shlibloadtest.c index bbac996..c879e9a 100644 --- a/test/shlibloadtest.c +++ b/test/shlibloadtest.c
@@ -13,7 +13,7 @@ #include <openssl/opensslv.h> #include <openssl/ssl.h> #include <openssl/types.h> -#include "crypto/dso_conf.h" +#include "simpledynamic.h" typedef void DSO; @@ -42,67 +42,7 @@ static const char *path_ssl; static const char *path_atexit; -#ifdef DSO_DLFCN - -# include <dlfcn.h> - -# define SHLIB_INIT NULL - -typedef void *SHLIB; -typedef void *SHLIB_SYM; - -static int shlib_load(const char *filename, SHLIB *lib) -{ - int dl_flags = (RTLD_GLOBAL|RTLD_LAZY); -#ifdef _AIX - if (filename[strlen(filename) - 1] == ')') - dl_flags |= RTLD_MEMBER; -#endif - *lib = dlopen(filename, dl_flags); - return *lib == NULL ? 0 : 1; -} - -static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym) -{ - *sym = dlsym(lib, symname); - return *sym != NULL; -} - -static int shlib_close(SHLIB lib) -{ - return dlclose(lib) != 0 ? 0 : 1; -} -#endif - -#ifdef DSO_WIN32 - -# include <windows.h> - -# define SHLIB_INIT 0 - -typedef HINSTANCE SHLIB; -typedef void *SHLIB_SYM; - -static int shlib_load(const char *filename, SHLIB *lib) -{ - *lib = LoadLibraryA(filename); - return *lib == NULL ? 0 : 1; -} - -static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym) -{ - *sym = (SHLIB_SYM)GetProcAddress(lib, symname); - return *sym != NULL; -} - -static int shlib_close(SHLIB lib) -{ - return FreeLibrary(lib) == 0 ? 0 : 1; -} -#endif - - -#if defined(DSO_DLFCN) || defined(DSO_WIN32) +#ifdef SD_INIT static int atexit_handler_done = 0; @@ -120,12 +60,12 @@ static int test_lib(void) { - SHLIB ssllib = SHLIB_INIT; - SHLIB cryptolib = SHLIB_INIT; + SD ssllib = SD_INIT; + SD cryptolib = SD_INIT; SSL_CTX *ctx; union { void (*func)(void); - SHLIB_SYM sym; + SD_SYM sym; } symbols[5]; TLS_method_t myTLS_method; SSL_CTX_new_t mySSL_CTX_new; @@ -142,7 +82,7 @@ case DSO_REFTEST: case NO_ATEXIT: case CRYPTO_FIRST: - if (!shlib_load(path_crypto, &cryptolib)) { + if (!sd_load(path_crypto, &cryptolib, SD_SHLIB)) { fprintf(stderr, "Failed to load libcrypto\n"); goto end; } @@ -151,13 +91,13 @@ /* Fall through */ case SSL_FIRST: - if (!shlib_load(path_ssl, &ssllib)) { + if (!sd_load(path_ssl, &ssllib, SD_SHLIB)) { fprintf(stderr, "Failed to load libssl\n"); goto end; } if (test_type != SSL_FIRST) break; - if (!shlib_load(path_crypto, &cryptolib)) { + if (!sd_load(path_crypto, &cryptolib, SD_SHLIB)) { fprintf(stderr, "Failed to load libcrypto\n"); goto end; } @@ -167,7 +107,7 @@ if (test_type == NO_ATEXIT) { OPENSSL_init_crypto_t myOPENSSL_init_crypto; - if (!shlib_sym(cryptolib, "OPENSSL_init_crypto", &symbols[0].sym)) { + if (!sd_sym(cryptolib, "OPENSSL_init_crypto", &symbols[0].sym)) { fprintf(stderr, "Failed to load OPENSSL_init_crypto symbol\n"); goto end; } @@ -181,9 +121,9 @@ if (test_type != JUST_CRYPTO && test_type != DSO_REFTEST && test_type != NO_ATEXIT) { - if (!shlib_sym(ssllib, "TLS_method", &symbols[0].sym) - || !shlib_sym(ssllib, "SSL_CTX_new", &symbols[1].sym) - || !shlib_sym(ssllib, "SSL_CTX_free", &symbols[2].sym)) { + if (!sd_sym(ssllib, "TLS_method", &symbols[0].sym) + || !sd_sym(ssllib, "SSL_CTX_new", &symbols[1].sym) + || !sd_sym(ssllib, "SSL_CTX_free", &symbols[2].sym)) { fprintf(stderr, "Failed to load libssl symbols\n"); goto end; } @@ -198,11 +138,11 @@ mySSL_CTX_free(ctx); } - if (!shlib_sym(cryptolib, "ERR_get_error", &symbols[0].sym) - || !shlib_sym(cryptolib, "OPENSSL_version_major", &symbols[1].sym) - || !shlib_sym(cryptolib, "OPENSSL_version_minor", &symbols[2].sym) - || !shlib_sym(cryptolib, "OPENSSL_version_patch", &symbols[3].sym) - || !shlib_sym(cryptolib, "OPENSSL_atexit", &symbols[4].sym)) { + if (!sd_sym(cryptolib, "ERR_get_error", &symbols[0].sym) + || !sd_sym(cryptolib, "OPENSSL_version_major", &symbols[1].sym) + || !sd_sym(cryptolib, "OPENSSL_version_minor", &symbols[2].sym) + || !sd_sym(cryptolib, "OPENSSL_version_patch", &symbols[3].sym) + || !sd_sym(cryptolib, "OPENSSL_atexit", &symbols[4].sym)) { fprintf(stderr, "Failed to load libcrypto symbols\n"); goto end; } @@ -242,8 +182,8 @@ * will always return an error, because DSO_pathbyaddr() is not * implemented there. */ - if (!shlib_sym(cryptolib, "DSO_dsobyaddr", &symbols[0].sym) - || !shlib_sym(cryptolib, "DSO_free", &symbols[1].sym)) { + if (!sd_sym(cryptolib, "DSO_dsobyaddr", &symbols[0].sym) + || !sd_sym(cryptolib, "DSO_free", &symbols[1].sym)) { fprintf(stderr, "Unable to load DSO symbols\n"); goto end; } @@ -264,13 +204,13 @@ # endif /* DSO_DLFCN */ } - if (!shlib_close(cryptolib)) { + if (!sd_close(cryptolib)) { fprintf(stderr, "Failed to close libcrypto\n"); goto end; } if (test_type == CRYPTO_FIRST || test_type == SSL_FIRST) { - if (!shlib_close(ssllib)) { + if (!sd_close(ssllib)) { fprintf(stderr, "Failed to close libssl\n"); goto end; } @@ -338,7 +278,7 @@ return 1; } -#if defined(DSO_DLFCN) || defined(DSO_WIN32) +#ifdef SD_INIT if (!test_lib()) return 1; #endif