diff options
-rw-r--r-- | ext/curl/interface.c | 6 | ||||
-rw-r--r-- | ext/curl/tests/bug46711.phpt | 31 |
2 files changed, 34 insertions, 3 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c index c1a55c17b5..eee863df94 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1733,17 +1733,17 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu Set an option for a cURL transfer */ PHP_FUNCTION(curl_setopt) { - zval *zid, *zvalue; + zval *zid, **zvalue; long zoption; php_curl *ch; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz", &zid, &zoption, &zvalue) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlZ", &zid, &zoption, &zvalue) == FAILURE) { return; } ZEND_FETCH_RESOURCE(ch, php_curl *, &zid, -1, le_curl_name, le_curl); - if (!_php_curl_setopt(ch, zoption, &zvalue, return_value TSRMLS_CC)) { + if (!_php_curl_setopt(ch, zoption, zvalue, return_value TSRMLS_CC)) { RETURN_TRUE; } else { RETURN_FALSE; diff --git a/ext/curl/tests/bug46711.phpt b/ext/curl/tests/bug46711.phpt new file mode 100644 index 0000000000..3f728c8591 --- /dev/null +++ b/ext/curl/tests/bug46711.phpt @@ -0,0 +1,31 @@ +--TEST-- +#46711 (lost memory when foreach is used for values passed to curl_setopt()) +--SKIP-- +<?php +if (!extension_loaded('curl')) die('skip need curl to work'); +?> +--FILE-- +<?php +$ch = curl_init(); + +$opt = array( + CURLOPT_AUTOREFERER => TRUE, + CURLOPT_BINARYTRANSFER => TRUE +); + +curl_setopt( $ch, CURLOPT_AUTOREFERER , TRUE ); + +foreach( $opt as $option => $value ) { + curl_setopt( $ch, $option, $value ); +} + +var_dump($opt); // with this bug, $opt[58] becomes NULL + +?> +--EXPECT-- +array(2) { + [58]=> + bool(true) + [19914]=> + bool(true) +} |