This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch sebb-mac-test in repository https://gitbox.apache.org/repos/asf/commons-crypto.git
The following commit(s) were added to refs/heads/sebb-mac-test by this push: new f0df518 Simplify; pull up fallback names to .c files f0df518 is described below commit f0df51850b0141352978852f1638735093f4b7fa Author: Sebb <s...@apache.org> AuthorDate: Sun Jun 26 16:43:27 2022 +0100 Simplify; pull up fallback names to .c files --- .../org/apache/commons/crypto/OpenSslInfoNative.c | 15 +---- .../commons/crypto/org_apache_commons_crypto.h | 70 ++++++++++++++++------ .../crypto/random/OpenSslCryptoRandomNative.c | 2 +- 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c b/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c index 1218f44..83cb2d8 100644 --- a/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c +++ b/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c @@ -57,22 +57,13 @@ static void get_methods(JNIEnv *env, void *openssl) static void get_methods(JNIEnv *env, HMODULE openssl) #endif { - LOAD_OPENSSL_VERSION_FUNCTION(dlsym_OpenSSL_version_num, env, openssl); + LOAD_DYNAMIC_SYMBOL_FALLBACK(dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); fprintf(stderr, "dlsym_OpenSSL_version_num() => %lx\n", dlsym_OpenSSL_version_num()); #ifdef UNIX - long version = dlsym_OpenSSL_version_num(); - if ((version <= VERSION_1_1_X) || version == 0x20000000) { - LOAD_DYNAMIC_SYMBOL(dlsym_OpenSSL_version, env, openssl, "SSLeay_version"); - } else { - LOAD_DYNAMIC_SYMBOL(dlsym_OpenSSL_version, env, openssl, "OpenSSL_version"); - } + LOAD_DYNAMIC_SYMBOL_FALLBACK(dlsym_OpenSSL_version, env, openssl, "OpenSSL_version", "SSLeay_version"); #endif #ifdef WINDOWS - if (dlsym_OpenSSL_version_num() > VERSION_1_1_X) { - LOAD_DYNAMIC_SYMBOL(__dlsym_OpenSSL_version, dlsym_OpenSSL_version, env, openssl, "OpenSSL_version"); - } else { - LOAD_DYNAMIC_SYMBOL(__dlsym_OpenSSL_version, dlsym_OpenSSL_version, env, openssl, "SSLeay_version"); - } + LOAD_DYNAMIC_SYMBOL_FALLBACK(__dlsym_OpenSSL_version, dlsym_OpenSSL_version, env, openssl, "OpenSSL_version", "SSLeay_version"); #endif } diff --git a/src/main/native/org/apache/commons/crypto/org_apache_commons_crypto.h b/src/main/native/org/apache/commons/crypto/org_apache_commons_crypto.h index 4f8561b..6407c68 100644 --- a/src/main/native/org/apache/commons/crypto/org_apache_commons_crypto.h +++ b/src/main/native/org/apache/commons/crypto/org_apache_commons_crypto.h @@ -94,15 +94,31 @@ void *do_dlsym(JNIEnv *env, void *handle, const char *symbol) { return func_ptr; } +/** + * A helper function to dlsym a 'symbol' from a given library-handle. + * Allows for fallback symbol name. + * + * @param env jni handle to report contingencies. + * @param handle handle to the dlopen'ed library. + * @param symbol symbol to load. + * @param fallback alternate symbol to load + * @return returns the address where the symbol is loaded in memory, + * <code>NULL</code> on error. + */ static __attribute__ ((unused)) -void *do_version_dlsym(JNIEnv *env, void *handle) { +void *do_dlsym_fallback(JNIEnv *env, void *handle, const char *symbol, const char *fallback) { if (!env || !handle) { THROW(env, "java/lang/InternalError", NULL); return NULL; } - void *func_ptr = dlsym(handle, "OpenSSL_version_num"); + char *error = NULL; + void *func_ptr = dlsym(handle, symbol); if (func_ptr == NULL) { - func_ptr = dlsym(handle, "SSLeay"); + func_ptr = dlsym(handle, fallback); + } + if ((error = dlerror()) != NULL) { + THROW(env, "java/lang/UnsatisfiedLinkError", symbol); + return NULL; } return func_ptr; } @@ -113,10 +129,10 @@ void *do_version_dlsym(JNIEnv *env, void *handle) { return; \ } -/* A macro to dlsym the appropriate OpenSSL version number function. */ -#define LOAD_OPENSSL_VERSION_FUNCTION(func_ptr, env, handle) \ - if ((func_ptr = do_version_dlsym(env, handle)) == NULL) { \ - THROW(env, "java/lang/Error", NULL); \ +/* A macro to dlsym the requisite dynamic symbol (with fallback) and bail-out on error. */ +#define LOAD_DYNAMIC_SYMBOL_FALLBACK(func_ptr, env, handle, symbol, fallback) \ + if ((func_ptr = do_dlsym_fallback(env, handle, symbol, fallback)) == NULL) { \ + return; \ } #endif // Unix part end @@ -188,24 +204,42 @@ static FARPROC WINAPI do_dlsym(JNIEnv *env, HMODULE handle, LPCSTR symbol) { return func_ptr; } -static FARPROC WINAPI do_version_dlsym(JNIEnv *env, HMODULE handle) { +/* A helper macro to dlsym the requisite dynamic symbol and bail-out on error. */ +#define LOAD_DYNAMIC_SYMBOL_FALLBACK(func_type, func_ptr, env, handle, symbol, fallback) \ + if ((func_ptr = (func_type) do_dlsym_fallback(env, handle, symbol, fallback)) == NULL) { \ + return; \ + } + +/** + * A helper function to dynamic load a 'symbol' from a given library-handle. + * + * @param env jni handle to report contingencies. + * @param handle handle to the dynamic library. + * @param symbol symbol to load. + * @param fallback alternate symbol to load. + * @return returns the address where the symbol is loaded in memory, + * <code>NULL</code> on error. + */ +static FARPROC WINAPI do_dlsym_fallback(JNIEnv *env, HMODULE handle, LPCSTR symbol, LPCSTR fallback) { + DWORD dwErrorCode = ERROR_SUCCESS; FARPROC func_ptr = NULL; - if (!env || !handle) { + + if (!env || !handle || !symbol) { THROW(env, "java/lang/InternalError", NULL); return NULL; } - func_ptr = GetProcAddress(handle, "OpenSSL_version_num"); - if (func_ptr == NULL) { - func_ptr = GetProcAddress(handle, "SSLeay"); + + func_ptr = GetProcAddress(handle, symbol); + if (func_ptr == NULL) + { + func_ptr = GetProcAddress(handle, fallback); + if (func_ptr == NULL) + { + THROW(env, "java/lang/UnsatisfiedLinkError", symbol); + } } return func_ptr; } - -/* A macro to dlsym the appropriate OpenSSL version number function. */ -#define LOAD_OPENSSL_VERSION_FUNCTION(func_ptr, env, handle) \ - if ((func_ptr = (__dlsym_OpenSSL_version_num) do_version_dlsym(env, handle)) == NULL) { \ - THROW(env, "java/lang/Error", NULL); \ - } #endif // Windows part end diff --git a/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c b/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c index 2516e2c..5b77ffb 100644 --- a/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c +++ b/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c @@ -119,7 +119,7 @@ JNIEXPORT void JNICALL Java_org_apache_commons_crypto_random_OpenSslCryptoRandom THROW(env, "java/lang/UnsatisfiedLinkError", msg); return; } - LOAD_OPENSSL_VERSION_FUNCTION(dlsym_OpenSSL_version_num, env, openssl); + LOAD_DYNAMIC_SYMBOL_FALLBACK(dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); #ifdef UNIX dlerror(); // Clear any existing error LOAD_DYNAMIC_SYMBOL(dlsym_CRYPTO_malloc, env, openssl, "CRYPTO_malloc");