diff --git a/src/_cffi_src/build_openssl.py b/src/_cffi_src/build_openssl.py index a09d6d8e8..8cc1066ad 100644 --- a/src/_cffi_src/build_openssl.py +++ b/src/_cffi_src/build_openssl.py @@ -40,7 +40,10 @@ def _get_openssl_libraries(platform): # -lpthread required due to usage of pthread an potential # existance of a static part containing e.g. pthread_atfork # (https://github.com/pyca/cryptography/issues/5084) - return ["ssl", "crypto", "pthread"] + if sys.platform == 'zos': + return ["ssl", "crypto"] + else: + return ["ssl", "crypto", "pthread"] def _extra_compile_args(platform): diff --git a/src/_cffi_src/openssl/callbacks.py b/src/_cffi_src/openssl/callbacks.py index 8ee01e0ed..33ebf4df4 100644 --- a/src/_cffi_src/openssl/callbacks.py +++ b/src/_cffi_src/openssl/callbacks.py @@ -20,6 +20,10 @@ INCLUDES = """ #include #include #endif + +#ifdef __MVS__ +#include +#endif """ TYPES = """ @@ -66,11 +70,23 @@ typedef pthread_mutex_t Cryptography_mutex; perror("Fatal error in callback initialization: " #call); \ abort(); \ } +#ifdef __MVS__ +/* When pthread_mutex_init is called more than once on the same mutex, + on z/OS this throws an EBUSY error. +*/ +#define ASSERT_STATUS_INIT(call) \ + if ((call) != 0 && errno != EBUSY) { \ + perror("Fatal error in callback initialization: " #call); \ + abort(); \ + } +#else +#define ASSERT_STATUS_INIT ASSERT_STATUS +#endif static inline void cryptography_mutex_init(Cryptography_mutex *mutex) { #if !defined(pthread_mutexattr_default) # define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL) #endif - ASSERT_STATUS(pthread_mutex_init(mutex, pthread_mutexattr_default)); + ASSERT_STATUS_INIT(pthread_mutex_init(mutex, pthread_mutexattr_default)); } static inline void cryptography_mutex_lock(Cryptography_mutex *mutex) { ASSERT_STATUS(pthread_mutex_lock(mutex)); diff --git a/src/_cffi_src/openssl/src/osrandom_engine.h b/src/_cffi_src/openssl/src/osrandom_engine.h index cf394f22a..47089b2eb 100644 --- a/src/_cffi_src/openssl/src/osrandom_engine.h +++ b/src/_cffi_src/openssl/src/osrandom_engine.h @@ -6,7 +6,9 @@ #include #include /* for defined(BSD) */ - #include + #ifndef __MVS__ + #include + #endif #ifdef BSD /* for SYS_getentropy */