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;
--- /dev/null
+--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)
+}