diff options
author | Michael Wallner <mike@php.net> | 2006-01-26 13:20:56 +0000 |
---|---|---|
committer | Michael Wallner <mike@php.net> | 2006-01-26 13:20:56 +0000 |
commit | 98ca921fb2b04d71ecb347886b5510150b33ae13 (patch) | |
tree | 04368f3cdaed5167358f63307f23d7477e1bc20a | |
parent | 078ca4ffb2a4cfda998f78d2a6b727f61ff9ce19 (diff) | |
download | php-git-98ca921fb2b04d71ecb347886b5510150b33ae13.tar.gz |
- fix bug #36152 problems with curl+ssl and pgsql+ssl in same PHP
-rw-r--r-- | ext/curl/interface.c | 199 |
1 files changed, 90 insertions, 109 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c index aa469465d0..5a4706fb6a 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -47,13 +47,11 @@ /* {{{ cruft for thread safe SSL crypto locks */ #if defined(ZTS) && defined(HAVE_CURL_SSL) # ifdef PHP_WIN32 -# define PHP_CURL_NEED_SSL_TSL # define PHP_CURL_NEED_OPENSSL_TSL # include <openssl/crypto.h> # else /* !PHP_WIN32 */ # if defined(HAVE_CURL_OPENSSL) # if defined(HAVE_OPENSSL_CRYPTO_H) -# define PHP_CURL_NEED_SSL_TSL # define PHP_CURL_NEED_OPENSSL_TSL # include <openssl/crypto.h> # else @@ -64,7 +62,6 @@ # endif # elif defined(HAVE_CURL_GNUTLS) # if defined(HAVE_GCRYPT_H) -# define PHP_CURL_NEED_SSL_TSL # define PHP_CURL_NEED_GNUTLS_TSL # include <gcrypt.h> # else @@ -94,10 +91,61 @@ int le_curl; int le_curl_multi_handle; -#ifdef PHP_CURL_NEED_SSL_TSL -static inline void php_curl_ssl_init(void); -static inline void php_curl_ssl_cleanup(void); +#ifdef PHP_CURL_NEED_OPENSSL_TSL /* {{{ */ +static MUTEX_T *php_curl_openssl_tsl = NULL; + +static void php_curl_ssl_lock(int mode, int n, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) { + tsrm_mutex_lock(php_curl_openssl_tsl[n]); + } else { + tsrm_mutex_unlock(php_curl_openssl_tsl[n]); + } +} + +static unsigned long php_curl_ssl_id(void) +{ + return (unsigned long) tsrm_thread_id(); +} #endif +/* }}} */ + +#ifdef PHP_CURL_NEED_GNUTLS_TSL /* {{{ */ +static int php_curl_ssl_mutex_create(void **m) +{ + if (*((MUTEX_T *) m) = tsrm_mutex_alloc()) { + return SUCCESS; + } else { + return FAILURE; + } +} + +static int php_curl_ssl_mutex_destroy(void **m) +{ + tsrm_mutex_free(*((MUTEX_T *) m)); + return SUCCESS; +} + +static int php_curl_ssl_mutex_lock(void **m) +{ + return tsrm_mutex_lock(*((MUTEX_T *) m)); +} + +static int php_curl_ssl_mutex_unlock(void **m) +{ + return tsrm_mutex_unlock(*((MUTEX_T *) m)); +} + +static struct gcry_thread_cbs php_curl_gnutls_tsl = { + GCRY_THREAD_OPTION_USER, + NULL, + php_curl_ssl_mutex_create, + php_curl_ssl_mutex_destroy, + php_curl_ssl_mutex_lock, + php_curl_ssl_mutex_unlock +}; +#endif +/* }}} */ static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC); @@ -449,9 +497,24 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLFTPAUTH_TLS); #endif -#ifdef PHP_CURL_NEED_SSL_TSL - php_curl_ssl_init(); +#ifdef PHP_CURL_NEED_OPENSSL_TSL + { + int i, c = CRYPTO_num_locks(); + + php_curl_openssl_tsl = malloc(c * sizeof(MUTEX_T)); + + for (i = 0; i < c; ++i) { + php_curl_openssl_tsl[i] = tsrm_mutex_alloc(); + } + + CRYPTO_set_id_callback(php_curl_ssl_id); + CRYPTO_set_locking_callback(php_curl_ssl_lock); + } #endif +#ifdef PHP_CURL_NEED_GNUTLS_TSL + gcry_control(GCRYCTL_SET_THREAD_CBS, &php_curl_gnutls_tsl); +#endif + if (curl_global_init(CURL_GLOBAL_SSL) != CURLE_OK) { return FAILURE; } @@ -488,9 +551,26 @@ PHP_MSHUTDOWN_FUNCTION(curl) php_unregister_url_stream_wrapper("ftp" TSRMLS_CC); php_unregister_url_stream_wrapper("ldap" TSRMLS_CC); #endif +#ifdef PHP_CURL_NEED_OPENSSL_TSL + /* ensure there are valid callbacks set */ + CRYPTO_set_id_callback(php_curl_ssl_id); + CRYPTO_set_locking_callback(php_curl_ssl_lock); +#endif curl_global_cleanup(); -#ifdef PHP_CURL_NEED_SSL_TSL - php_curl_ssl_cleanup(); +#ifdef PHP_CURL_NEED_OPENSSL_TSL + if (php_curl_openssl_tsl) { + int i, c = CRYPTO_num_locks(); + + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + + for (i = 0; i < c; ++i) { + tsrm_mutex_free(php_curl_openssl_tsl[i]); + } + + free(php_curl_openssl_tsl); + php_curl_openssl_tsl = NULL; + } #endif return SUCCESS; } @@ -1683,105 +1763,6 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC) } /* }}} */ -#ifdef PHP_CURL_NEED_OPENSSL_TSL -/* {{{ */ -static MUTEX_T *php_curl_openssl_tsl = NULL; - -static void php_curl_ssl_lock(int mode, int n, const char * file, int line) -{ - if (mode & CRYPTO_LOCK) { - tsrm_mutex_lock(php_curl_openssl_tsl[n]); - } else { - tsrm_mutex_unlock(php_curl_openssl_tsl[n]); - } -} - -static unsigned long php_curl_ssl_id(void) -{ - return (unsigned long) tsrm_thread_id(); -} - -static inline void php_curl_ssl_init(void) -{ - int i, c = CRYPTO_num_locks(); - - php_curl_openssl_tsl = malloc(c * sizeof(MUTEX_T)); - - for (i = 0; i < c; ++i) { - php_curl_openssl_tsl[i] = tsrm_mutex_alloc(); - } - - CRYPTO_set_id_callback(php_curl_ssl_id); - CRYPTO_set_locking_callback(php_curl_ssl_lock); -} - -static inline void php_curl_ssl_cleanup(void) -{ - if (php_curl_openssl_tsl) { - int i, c = CRYPTO_num_locks(); - - CRYPTO_set_id_callback(NULL); - CRYPTO_set_locking_callback(NULL); - - for (i = 0; i < c; ++i) { - tsrm_mutex_free(php_curl_openssl_tsl[i]); - } - - free(php_curl_openssl_tsl); - php_curl_openssl_tsl = NULL; - } -} -#endif /* PHP_CURL_NEED_OPENSSL_TSL */ -/* }}} */ - -#ifdef PHP_CURL_NEED_GNUTLS_TSL -/* {{{ */ -static int php_curl_ssl_mutex_create(void **m) -{ - if (*((MUTEX_T *) m) = tsrm_mutex_alloc()) { - return SUCCESS; - } else { - return FAILURE; - } -} - -static int php_curl_ssl_mutex_destroy(void **m) -{ - tsrm_mutex_free(*((MUTEX_T *) m)); - return SUCCESS; -} - -static int php_curl_ssl_mutex_lock(void **m) -{ - return tsrm_mutex_lock(*((MUTEX_T *) m)); -} - -static int php_curl_ssl_mutex_unlock(void **m) -{ - return tsrm_mutex_unlock(*((MUTEX_T *) m)); -} - -static struct gcry_thread_cbs php_curl_gnutls_tsl = { - GCRY_THREAD_OPTION_USER, - NULL, - php_curl_ssl_mutex_create, - php_curl_ssl_mutex_destroy, - php_curl_ssl_mutex_lock, - php_curl_ssl_mutex_unlock -}; - -static inline void php_curl_ssl_init(void) -{ - gcry_control(GCRYCTL_SET_THREAD_CBS, &php_curl_gnutls_tsl); -} - -static inline void php_curl_ssl_cleanup(void) -{ - return; -} -#endif /* PHP_CURL_NEED_GNUTLS_TSL */ -/* }}} */ - #endif /* HAVE_CURL */ /* |