mike Tue Oct 25 10:32:34 2005 EDT Modified files: (Branch: PHP_5_1) /php-src NEWS /php-src/ext/curl config.m4 config.w32 interface.c Log: - MFH: thread safe SSL crypto locks, fixes bug #33760
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2027.2.157&r2=1.2027.2.158&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.157 php-src/NEWS:1.2027.2.158 --- php-src/NEWS:1.2027.2.157 Mon Oct 24 03:44:11 2005 +++ php-src/NEWS Tue Oct 25 10:32:32 2005 @@ -17,6 +17,8 @@ - Fixed bug #34712 (zend.ze1_compatibility_mode = on segfault). (Dmitry) - Fixed bug #33829 (mime_content_type() returns text/plain for gzip and bzip files). (Derick) +- Fixed bug #33760 (cURL needs to implement CRYPTO_callback functions to prevent + locking). (Mike, Ilia) - Fixed bug #34623 (Crash in pdo_mysql on longtext fields). (Ilia) - Fixed bug #31341 (escape on curly inconsistent). (Dmitry) - Fixed bug #31177 (menory leaks and corruption because of incorrect http://cvs.php.net/diff.php/php-src/ext/curl/config.m4?r1=1.28&r2=1.28.2.1&ty=u Index: php-src/ext/curl/config.m4 diff -u php-src/ext/curl/config.m4:1.28 php-src/ext/curl/config.m4:1.28.2.1 --- php-src/ext/curl/config.m4:1.28 Fri May 6 22:51:51 2005 +++ php-src/ext/curl/config.m4 Tue Oct 25 10:32:33 2005 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4,v 1.28 2005/05/07 02:51:51 sniper Exp $ +dnl $Id: config.m4,v 1.28.2.1 2005/10/25 14:32:33 mike Exp $ dnl PHP_ARG_WITH(curl, for CURL support, @@ -48,6 +48,38 @@ else AC_MSG_ERROR(cURL version 7.10.5 or later is required to compile php with cURL support) fi + + AC_MSG_CHECKING([for SSL support in libcurl]) + CURL_SSL=`$CURL_CONFIG --features | $EGREP SSL` + if test "$CURL_SSL" == "SSL"; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CURL_SSL], [1], [Have cURL with SSL support]) + + AC_MSG_CHECKING([for SSL library used]) + CURL_SSL_FLAVOUR= + for i in $CURL_LIBS; do + if test "$i" == "-lssl"; then + CURL_SSL_FLAVOUR="openssl" + AC_MSG_RESULT([openssl]) + AC_DEFINE([HAVE_CURL_OPENSSL], [1], [Have cURL with OpenSSL support]) + AC_CHECK_HEADERS([openssl/crypto.h]) + break + elif test "$i" == "-lgnutls"; then + CURL_SSL_FLAVOUR="gnutls" + AC_MSG_RESULT([gnutls]) + AC_DEFINE([HAVE_CURL_GNUTLS], [1], [Have cURL with GnuTLS support]) + AC_CHECK_HEADERS([gcrypt.h]) + break + fi + done + if test -z "$CURL_SSL_FLAVOUR"; then + AC_MSG_RESULT([unknown!]) + AC_MSG_WARN([Could not determine the type of SSL library used!]) + AC_MSG_WARN([Building will fail in ZTS mode!]) + fi + else + AC_MSG_RESULT([no]) + fi PHP_ADD_INCLUDE($CURL_DIR/include) PHP_EVAL_LIBLINE($CURL_LIBS, CURL_SHARED_LIBADD) http://cvs.php.net/diff.php/php-src/ext/curl/config.w32?r1=1.3&r2=1.3.4.1&ty=u Index: php-src/ext/curl/config.w32 diff -u php-src/ext/curl/config.w32:1.3 php-src/ext/curl/config.w32:1.3.4.1 --- php-src/ext/curl/config.w32:1.3 Tue Jan 13 00:30:53 2004 +++ php-src/ext/curl/config.w32 Tue Oct 25 10:32:33 2005 @@ -1,4 +1,4 @@ -// $Id: config.w32,v 1.3 2004/01/13 05:30:53 pollita Exp $ +// $Id: config.w32,v 1.3.4.1 2005/10/25 14:32:33 mike Exp $ // vim:ft=javascript ARG_WITH("curl", "CURL support", "no"); @@ -12,6 +12,7 @@ CHECK_LIB("winmm.lib", "curl", PHP_CURL)) { EXTENSION("curl", "interface.c multi.c streams.c"); AC_DEFINE('HAVE_CURL', 1, 'Have CURL library'); + AC_DEFINE('HAVE_CURL_SSL', 1, 'Have SSL suppurt in CURL'); // TODO: check for curl_version_info // AC_DEFINE('PHP_CURL_URL_WRAPPERS', 0, 'Use curl for URL wrappers [experimental]'); } else { http://cvs.php.net/diff.php/php-src/ext/curl/interface.c?r1=1.62.2.3&r2=1.62.2.4&ty=u Index: php-src/ext/curl/interface.c diff -u php-src/ext/curl/interface.c:1.62.2.3 php-src/ext/curl/interface.c:1.62.2.4 --- php-src/ext/curl/interface.c:1.62.2.3 Sun Oct 16 22:43:20 2005 +++ php-src/ext/curl/interface.c Tue Oct 25 10:32:33 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interface.c,v 1.62.2.3 2005/10/17 02:43:20 iliaa Exp $ */ +/* $Id: interface.c,v 1.62.2.4 2005/10/25 14:32:33 mike Exp $ */ #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS @@ -44,6 +44,45 @@ #define HttpPost curl_httppost #endif +/* {{{ 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 +# warning \ + "libcurl was compiled with OpenSSL support, but configure could not find " \ + "openssl/crypto.h; thus no SSL crypto locking callbacks will be set, which may " \ + "cause random crashes on SSL requests" +# 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 +# warning \ + "libcurl was compiled with GnuTLS support, but configure could not find " \ + "gcrypt.h; thus no SSL crypto locking callbacks will be set, which may " \ + "cause random crashes on SSL requests" +# endif +# else +# warning \ + "libcurl was compiled with SSL support, but configure could not determine which" \ + "library was used; thus no SSL crypto locking callbacks will be set, which may " \ + "cause random crashes on SSL requests" +# endif /* HAVE_CURL_OPENSSL || HAVE_CURL_GNUTLS */ +# endif /* PHP_WIN32 */ +#endif /* ZTS && HAVE_CURL_SSL */ +/* }}} */ + #define SMART_STR_PREALLOC 4096 #include "ext/standard/php_smart_str.h" @@ -55,6 +94,11 @@ 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); +#endif + static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC); #define SAVE_CURL_ERROR(__handle, __err) (__handle)->err.no = (int) __err; @@ -403,6 +447,9 @@ REGISTER_CURL_CONSTANT(CURLFTPAUTH_TLS); #endif +#ifdef PHP_CURL_NEED_SSL_TSL + php_curl_ssl_init(); +#endif if (curl_global_init(CURL_GLOBAL_SSL) != CURLE_OK) { return FAILURE; } @@ -440,7 +487,9 @@ php_unregister_url_stream_wrapper("ldap" TSRMLS_CC); #endif curl_global_cleanup(); - +#ifdef PHP_CURL_NEED_SSL_TSL + php_curl_ssl_cleanup(); +#endif return SUCCESS; } /* }}} */ @@ -1545,7 +1594,106 @@ } /* }}} */ -#endif +#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_OPTIONS_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 */ /* * Local variables:
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php