This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-crypto.git
The following commit(s) were added to refs/heads/master by this push: new 3ee3f65 Simplify; provide fallback names in .c files 3ee3f65 is described below commit 3ee3f65c6052572920d18ed30d6cda86798e2391 Author: Sebb <s...@apache.org> AuthorDate: Sun Jun 26 17:24:44 2022 +0100 Simplify; provide fallback names in .c files --- .../org/apache/commons/crypto/OpenSslInfoNative.c | 15 ++--- .../commons/crypto/org_apache_commons_crypto.h | 70 ++++++++++++++++------ .../crypto/random/OpenSslCryptoRandomNative.c | 3 +- .../java/org/apache/commons/crypto/CryptoTest.java | 4 +- 4 files changed, 60 insertions(+), 32 deletions(-) diff --git a/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c b/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c index 4b9f8e9..e2bff49 100644 --- a/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c +++ b/src/main/native/org/apache/commons/crypto/OpenSslInfoNative.c @@ -57,20 +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); #ifdef UNIX - if (dlsym_OpenSSL_version_num() > VERSION_1_1_X) { - LOAD_DYNAMIC_SYMBOL(dlsym_OpenSSL_version, env, openssl, "OpenSSL_version"); - } else { - LOAD_DYNAMIC_SYMBOL(dlsym_OpenSSL_version, env, openssl, "SSLeay_version"); - } + LOAD_DYNAMIC_SYMBOL_FALLBACK(dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); + 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_num, dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); + 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..b9b810f 100644 --- a/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c +++ b/src/main/native/org/apache/commons/crypto/random/OpenSslCryptoRandomNative.c @@ -119,8 +119,8 @@ 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); #ifdef UNIX + LOAD_DYNAMIC_SYMBOL_FALLBACK(dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); dlerror(); // Clear any existing error LOAD_DYNAMIC_SYMBOL(dlsym_CRYPTO_malloc, env, openssl, "CRYPTO_malloc"); LOAD_DYNAMIC_SYMBOL(dlsym_CRYPTO_free, env, openssl, "CRYPTO_free"); @@ -141,6 +141,7 @@ JNIEXPORT void JNICALL Java_org_apache_commons_crypto_random_OpenSslCryptoRandom #endif #ifdef WINDOWS + LOAD_DYNAMIC_SYMBOL_FALLBACK(__dlsym_OpenSSL_version_num, dlsym_OpenSSL_version_num, env, openssl, "OpenSSL_version_num", "SSLeay"); LOAD_DYNAMIC_SYMBOL(__dlsym_CRYPTO_malloc, dlsym_CRYPTO_malloc, env, openssl, "CRYPTO_malloc"); LOAD_DYNAMIC_SYMBOL(__dlsym_CRYPTO_free, dlsym_CRYPTO_free, env, openssl, "CRYPTO_free"); LOAD_DYNAMIC_SYMBOL(__dlsym_ENGINE_by_id, dlsym_ENGINE_by_id, env, openssl, "ENGINE_by_id"); diff --git a/src/test/java/org/apache/commons/crypto/CryptoTest.java b/src/test/java/org/apache/commons/crypto/CryptoTest.java index 8cddcd5..59d1bd6 100644 --- a/src/test/java/org/apache/commons/crypto/CryptoTest.java +++ b/src/test/java/org/apache/commons/crypto/CryptoTest.java @@ -21,7 +21,6 @@ package org.apache.commons.crypto; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class CryptoTest { @@ -49,7 +48,6 @@ public class CryptoTest { } @Test - @Disabled("Mac64 failure with OpenSSL 1.1.1g") public void testMain() throws Throwable { try { Crypto.main(new String[0]); @@ -58,6 +56,7 @@ public class CryptoTest { System.err.println("Special case; LoadingError = " + loadingError); throw loadingError != null ? loadingError : e; } + assertTrue(true, "Completed OK"); } @Test @@ -66,6 +65,7 @@ public class CryptoTest { if (loadingError != null) { throw loadingError; } + assertTrue(true, "Completed OK"); } }