Skip to content

Commit 71daca2

Browse files
committed
Merge branch 'bug70157' into PHP-5.6
* bug70157: Fixed #70157 parse_ini_string() segmentation fault with INI_SCANNER_TYPED
2 parents a4e0539 + 0d7159d commit 71daca2

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

Zend/zend_ini_parser.y

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,18 @@ static void zend_ini_init_string(zval *result)
108108
*/
109109
static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
110110
{
111-
int length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2);
111+
int length;
112+
113+
if (Z_TYPE_P(op1) != IS_STRING) {
114+
zval copy;
115+
MAKE_COPY_ZVAL(&op1, &copy);
116+
convert_to_string(&copy);
117+
Z_STRVAL_P(op1) = zend_strndup(Z_STRVAL(copy), Z_STRLEN(copy));
118+
Z_STRLEN_P(op1) = Z_STRLEN(copy);
119+
zval_dtor(&copy);
120+
}
121+
122+
length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2);
112123

113124
Z_STRVAL_P(result) = (char *) realloc(Z_STRVAL_P(op1), length+1);
114125
memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));
@@ -213,7 +224,7 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro
213224
zend_file_handle_dtor(fh TSRMLS_CC);
214225

215226
shutdown_ini_scanner(TSRMLS_C);
216-
227+
217228
if (retval == 0) {
218229
return SUCCESS;
219230
} else {
@@ -303,7 +314,11 @@ statement:
303314
#endif
304315
ZEND_INI_PARSER_CB(&$1, &$5, &$2, ZEND_INI_PARSER_POP_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC);
305316
free(Z_STRVAL($1));
306-
free(Z_STRVAL($2));
317+
if (Z_TYPE($2) == IS_STRING) {
318+
free(Z_STRVAL($2));
319+
} else {
320+
zval_dtor(&$2);
321+
}
307322
zval_internal_dtor(&$5);
308323
}
309324
| TC_LABEL { ZEND_INI_PARSER_CB(&$1, NULL, NULL, ZEND_INI_PARSER_ENTRY, ZEND_INI_PARSER_ARG TSRMLS_CC); free(Z_STRVAL($1)); }

ext/standard/basic_functions.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3515,7 +3515,7 @@ PHPAPI double php_get_inf(void) /* {{{ */
35153515

35163516
#define BASIC_ADD_SUBMODULE(module) \
35173517
zend_hash_add_empty_element(&basic_submodules, #module, strlen(#module));
3518-
3518+
35193519
#define BASIC_RINIT_SUBMODULE(module) \
35203520
if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
35213521
PHP_RINIT(module)(INIT_FUNC_ARGS_PASSTHRU); \
@@ -5903,10 +5903,11 @@ static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int cal
59035903
ALLOC_ZVAL(element);
59045904
MAKE_COPY_ZVAL(&arg2, element);
59055905

5906-
if (arg3 && Z_STRLEN_P(arg3) > 0) {
5907-
add_assoc_zval_ex(hash, Z_STRVAL_P(arg3), Z_STRLEN_P(arg3) + 1, element);
5908-
} else {
5906+
if (!arg3 || (Z_TYPE_P(arg3) == IS_STRING && Z_STRLEN_P(arg3) == 0)) {
59095907
add_next_index_zval(hash, element);
5908+
} else {
5909+
array_set_zval_key(Z_ARRVAL_P(hash), arg3, element);
5910+
zval_ptr_dtor(&element);
59105911
}
59115912
}
59125913
break;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
parse_ini_string() crashes on values starting with number or unquoted strings
3+
--FILE--
4+
<?php
5+
6+
$contents = <<<EOS
7+
[agatha.christie]
8+
title = 10 little indians
9+
foo[123] = E_ALL & ~E_DEPRECATED
10+
foo[456] = 123
11+
EOS;
12+
13+
var_dump(parse_ini_string($contents, false, INI_SCANNER_TYPED));
14+
15+
?>
16+
Done
17+
--EXPECTF--
18+
array(%d) {
19+
["title"]=>
20+
string(%d) "10 little indians"
21+
["foo"]=>
22+
array(%d) {
23+
[123]=>
24+
string(%d) "24575"
25+
[456]=>
26+
int(123)
27+
}
28+
}
29+
Done

0 commit comments

Comments
 (0)