summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTjerk Meesters <datibbaw@php.net>2015-08-15 16:29:12 +0800
committerTjerk Meesters <datibbaw@php.net>2015-08-15 16:49:30 +0800
commit0bd7d7a3691cee4e916d1008500cf21b80e03056 (patch)
tree3060ccc058447c56c4e42dfbefad42e2a4311552
parentc63b50557318132723494d945ae284f517ab2e16 (diff)
parentb0c5439b5f1874070b1baae2dd4c70530b724da1 (diff)
downloadphp-git-0bd7d7a3691cee4e916d1008500cf21b80e03056.tar.gz
Merge branch 'PHP-5.6'
* PHP-5.6: Updated NEWS for #70157 Fixed #70157 parse_ini_string() segmentation fault with INI_SCANNER_TYPED
-rw-r--r--Zend/zend_ini_parser.y18
-rw-r--r--ext/standard/basic_functions.c8
-rw-r--r--ext/standard/tests/general_functions/bug70157.phpt29
3 files changed, 48 insertions, 7 deletions
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 565d83eef8..2bcebe8a03 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -102,8 +102,16 @@ static void zend_ini_init_string(zval *result)
*/
static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
{
- int op1_len = (int)Z_STRLEN_P(op1);
- int length = op1_len + (int)Z_STRLEN_P(op2);
+ int length, op1_len;
+
+ if (Z_TYPE_P(op1) != IS_STRING) {
+ zend_string *str = zval_get_string(op1);
+ ZVAL_PSTRINGL(op1, str->val, str->len);
+ zend_string_release(str);
+ }
+
+ op1_len = (int)Z_STRLEN_P(op1);
+ length = op1_len + (int)Z_STRLEN_P(op2);
ZVAL_NEW_STR(result, zend_string_extend(Z_STR_P(op1), length, 1));
memcpy(Z_STRVAL_P(result)+op1_len, Z_STRVAL_P(op2), Z_STRLEN_P(op2));
@@ -300,7 +308,11 @@ statement:
#endif
ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG);
zend_string_release(Z_STR($1));
- zend_string_release(Z_STR($2));
+ if (Z_TYPE($2) == IS_STRING) {
+ zend_string_release(Z_STR($2));
+ } else {
+ zval_dtor(&$2);
+ }
zval_ptr_dtor(&$5);
}
| TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG); zend_string_release(Z_STR($1)); }
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 3f03275aa5..8b83d558d3 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -5845,11 +5845,11 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal
}
ZVAL_DUP(&element, arg2);
-
- if (arg3 && Z_STRLEN_P(arg3) > 0) {
- zend_symtable_update(Z_ARRVAL_P(find_hash), Z_STR_P(arg3), &element);
- } else {
+ if (!arg3 || (Z_TYPE_P(arg3) == IS_STRING && Z_STRLEN_P(arg3) == 0)) {
add_next_index_zval(find_hash, &element);
+ } else {
+ array_set_zval_key(Z_ARRVAL_P(find_hash), arg3, &element);
+ zval_ptr_dtor(&element);
}
}
break;
diff --git a/ext/standard/tests/general_functions/bug70157.phpt b/ext/standard/tests/general_functions/bug70157.phpt
new file mode 100644
index 0000000000..f593682051
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug70157.phpt
@@ -0,0 +1,29 @@
+--TEST--
+parse_ini_string() crashes on values starting with number or unquoted strings
+--FILE--
+<?php
+
+$contents = <<<EOS
+[agatha.christie]
+title = 10 little indians
+foo[123] = E_ALL & ~E_DEPRECATED
+foo[456] = 123
+EOS;
+
+var_dump(parse_ini_string($contents, false, INI_SCANNER_TYPED));
+
+?>
+Done
+--EXPECTF--
+array(%d) {
+ ["title"]=>
+ string(%d) "10 little indians"
+ ["foo"]=>
+ array(%d) {
+ [123]=>
+ string(%d) "24575"
+ [456]=>
+ int(123)
+ }
+}
+Done