summaryrefslogtreecommitdiff
path: root/ext/curl/interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/curl/interface.c')
-rw-r--r--ext/curl/interface.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 00dbfd3d2..531f15ba1 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2012 The PHP Group |
+ | Copyright (c) 1997-2013 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -977,6 +977,15 @@ PHP_MSHUTDOWN_FUNCTION(curl)
}
/* }}} */
+/* {{{ curl_write_nothing
+ * Used as a work around. See _php_curl_close_ex
+ */
+static size_t curl_write_nothing(char *data, size_t size, size_t nmemb, void *ctx)
+{
+ return size * nmemb;
+}
+/* }}} */
+
/* {{{ curl_write
*/
static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
@@ -1685,8 +1694,14 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
switch (option) {
/* Long options */
case CURLOPT_SSL_VERIFYHOST:
- if(Z_TYPE_PP(zvalue)==IS_BOOL && Z_BVAL_PP(zvalue)) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "CURLOPT_SSL_VERIFYHOST set to true which disables common name validation (setting CURLOPT_SSL_VERIFYHOST to 2 enables common name validation)");
+ if(Z_BVAL_PP(zvalue) == 1) {
+#if LIBCURL_VERSION_NUM <= 0x071c00 /* 7.28.0 */
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "CURLOPT_SSL_VERIFYHOST with value 1 is deprecated and will be removed as of libcurl 7.28.1. It is recommended to use value 2 instead");
+#else
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "CURLOPT_SSL_VERIFYHOST no longer accepts the value 1, value 2 will be used instead");
+ error = curl_easy_setopt(ch->cp, option, 2);
+ break;
+#endif
}
case CURLOPT_INFILESIZE:
case CURLOPT_VERBOSE:
@@ -1836,10 +1851,6 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
case CURLOPT_SSH_PRIVATE_KEYFILE:
#endif
{
-#if LIBCURL_VERSION_NUM < 0x071100
- char *copystr = NULL;
-#endif
-
convert_to_string_ex(zvalue);
#if LIBCURL_VERSION_NUM >= 0x071300
if (
@@ -2120,6 +2131,9 @@ string_copy:
return 1;
}
+ if (Z_REFCOUNT_P(ch->clone) <= 1) {
+ zend_llist_clean(&ch->to_free->post);
+ }
zend_llist_add_element(&ch->to_free->post, &first);
error = curl_easy_setopt(ch->cp, CURLOPT_HTTPPOST, first);
@@ -2646,6 +2660,21 @@ static void _php_curl_close_ex(php_curl *ch TSRMLS_DC)
#endif
_php_curl_verify_handlers(ch, 0 TSRMLS_CC);
+
+ /*
+ * Libcurl is doing connection caching. When easy handle is cleaned up,
+ * if the handle was previously used by the curl_multi_api, the connection
+ * remains open un the curl multi handle is cleaned up. Some protocols are
+ * sending content like the FTP one, and libcurl try to use the
+ * WRITEFUNCTION or the HEADERFUNCTION. Since structures used in those
+ * callback are freed, we need to use an other callback to which avoid
+ * segfaults.
+ *
+ * Libcurl commit d021f2e8a00 fix this issue and should be part of 7.28.2
+ */
+ curl_easy_setopt(ch->cp, CURLOPT_HEADERFUNCTION, curl_write_nothing);
+ curl_easy_setopt(ch->cp, CURLOPT_WRITEFUNCTION, curl_write_nothing);
+
curl_easy_cleanup(ch->cp);
/* cURL destructors should be invoked only by last curl handle */