You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2022/06/26 15:43:34 UTC
[commons-crypto] branch sebb-mac-test updated: Simplify; pull up fallback names to .c files
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 <se...@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");