|
|
- This patch has been tested with OpenSSL 1.0.2q, 1.1.0j and 1.1.1a
- with and without support for deprecated OpenSSL APIs.
-
- --- a/configure.ac
- +++ b/configure.ac
- @@ -860,26 +860,10 @@ then
- AC_SEARCH_LIBS([ERR_peek_error], [crypto], ,
- AC_MSG_ERROR([libcrypto not found]))
-
- - AC_SEARCH_LIBS([SSL_library_init], [ssl], ,
- - [
- - if test x"$enable_shared" = x"yes"
- - then
- - AC_MSG_ERROR([Cannot build shared opendkim
- - against static openssl libraries.
- - Configure with --disable-shared
- - to get this working or obtain a
- - shared libssl library for
- - opendkim to use.])
- - fi
- -
- - # avoid caching issue - last result of SSL_library_init
- - # shouldn't be cached for this next check
- - unset ac_cv_search_SSL_library_init
- - LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS -ldl"
- - AC_SEARCH_LIBS([SSL_library_init], [ssl], ,
- - AC_MSG_ERROR([libssl not found]), [-ldl])
- - ]
- - )
- + od_have_ossl="no"
- + AC_CHECK_LIB(ssl, OPENSSL_init_ssl, [od_have_ossl="yes"])
- + AC_CHECK_LIB(ssl, SSL_library_init, [od_have_ossl="yes"])
- + AS_IF([test "x$od_have_ossl" = xno], [AC_MSG_ERROR([libssl not found])])
-
- AC_CHECK_DECL([SHA256_DIGEST_LENGTH],
- AC_DEFINE([HAVE_SHA256], 1,
- --- a/opendkim/opendkim-crypto.c
- +++ b/opendkim/opendkim-crypto.c
- @@ -139,6 +139,7 @@ static unsigned int nmutexes = 0;
- static unsigned long threadid = 0L;
- static pthread_mutex_t *mutexes = NULL;
-
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- /*
- ** DKIMF_CRYPTO_LOCK_CALLBACK -- locking callback for libcrypto
- **
- @@ -166,6 +167,7 @@ dkimf_crypto_lock_callback(int mode, int
-
- assert(status == 0);
- }
- +#endif
-
- /*
- ** DKIMF_CRYPTO_GET_ID -- generate/retrieve thread ID
- @@ -208,21 +210,15 @@ dkimf_crypto_get_id(void)
- static void
- dkimf_crypto_free_id(void *ptr)
- {
- - /*
- - ** Trick dkimf_crypto_get_id(); the thread-specific pointer has
- - ** already been cleared at this point, but dkimf_crypto_get_id()
- - ** may be called by ERR_remove_state() which will then allocate a
- - ** new thread pointer if the thread-specific pointer is NULL. This
- - ** means a memory leak of thread IDs and, on Solaris, an infinite loop
- - ** because the destructor (indirectly) re-sets the thread-specific
- - ** pointer to something not NULL. See pthread_key_create(3).
- - */
- -
- if (ptr != NULL)
- {
- assert(pthread_setspecific(id_key, ptr) == 0);
-
- - ERR_remove_state(0);
- +#if OPENSSL_VERSION_NUMBER >= 0x10100000
- + OPENSSL_thread_stop();
- +#else
- + ERR_remove_thread_state(NULL);
- +#endif
-
- free(ptr);
-
- @@ -300,6 +296,7 @@ dkimf_crypto_dyn_destroy(struct CRYPTO_d
- ** None.
- */
-
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- static void
- dkimf_crypto_dyn_lock(int mode, struct CRYPTO_dynlock_value *lock,
- /* UNUSED */ const char *file,
- @@ -316,6 +313,7 @@ dkimf_crypto_dyn_lock(int mode, struct C
-
- assert(status == 0);
- }
- +#endif
-
- /*
- ** DKIMF_CRYPTO_INIT -- set up openssl dependencies
- @@ -335,7 +333,12 @@ dkimf_crypto_init(void)
- int n;
- int status;
-
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- n = CRYPTO_num_locks();
- +#else
- + // see openssl/crypto.h for more details
- + n = 1;
- +#endif
- mutexes = (pthread_mutex_t *) malloc(n * sizeof(pthread_mutex_t));
- if (mutexes == NULL)
- return errno;
- @@ -357,15 +360,22 @@ dkimf_crypto_init(void)
- if (status != 0)
- return status;
-
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- SSL_load_error_strings();
- SSL_library_init();
- ERR_load_crypto_strings();
- +#else
- + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
- + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
- +#endif
-
- +#if OPENSSL_VERSION_NUMBER < 0x10000000
- CRYPTO_set_id_callback(&dkimf_crypto_get_id);
- CRYPTO_set_locking_callback(&dkimf_crypto_lock_callback);
- CRYPTO_set_dynlock_create_callback(&dkimf_crypto_dyn_create);
- CRYPTO_set_dynlock_lock_callback(&dkimf_crypto_dyn_lock);
- CRYPTO_set_dynlock_destroy_callback(&dkimf_crypto_dyn_destroy);
- +#endif
-
- #ifdef USE_OPENSSL_ENGINE
- if (!SSL_set_engine(NULL))
- @@ -392,11 +402,15 @@ dkimf_crypto_free(void)
- {
- if (crypto_init_done)
- {
- +#if OPENSSL_VERSION_NUMBER >= 0x10100000
- + OPENSSL_thread_stop();
- +#else
- CRYPTO_cleanup_all_ex_data();
- CONF_modules_free();
- EVP_cleanup();
- ERR_free_strings();
- - ERR_remove_state(0);
- + ERR_remove_thread_state(NULL);
- +#endif
-
- if (nmutexes > 0)
- {
- --- a/libopendkim/dkim.c
- +++ b/libopendkim/dkim.c
- @@ -4195,8 +4195,10 @@ dkim_init_openssl(void)
- {
- pthread_mutex_lock(&openssl_lock);
-
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- if (openssl_refcount == 0)
- OpenSSL_add_all_algorithms();
- +#endif
- openssl_refcount++;
-
- pthread_mutex_unlock(&openssl_lock);
- @@ -4220,8 +4222,10 @@ dkim_close_openssl(void)
- pthread_mutex_lock(&openssl_lock);
-
- openssl_refcount--;
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- if (openssl_refcount == 0)
- EVP_cleanup();
- +#endif
-
- pthread_mutex_unlock(&openssl_lock);
- }
- --- a/opendkim/opendkim-testkey.c
- +++ b/opendkim/opendkim-testkey.c
- @@ -452,7 +452,11 @@ main(int argc, char **argv)
- memset(err, '\0', sizeof err);
-
- #ifndef USE_GNUTLS
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- ERR_load_crypto_strings();
- +#else
- + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
- +#endif
- #endif /* ! USE_GNUTLS */
-
- /* process a KeyTable if specified and not overridden */
- --- a/opendkim/opendkim.c
- +++ b/opendkim/opendkim.c
- @@ -15540,7 +15540,11 @@ main(int argc, char **argv)
- printf("\tCompiled with GnuTLS %s\n", GNUTLS_VERSION);
- #else /* USE_GNUTLS */
- printf("\tCompiled with %s\n",
- +#if OPENSSL_VERSION_NUMBER < 0x10100000
- SSLeay_version(SSLEAY_VERSION));
- +#else
- + OpenSSL_version(OPENSSL_VERSION));
- +#endif
- #endif /* USE_GNUTLS */
- printf("\tSMFI_VERSION 0x%x\n", SMFI_VERSION);
- #ifdef HAVE_SMFI_VERSION
|