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");