summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2015-11-20 06:37:38 -0800
committerAnatol Belski <ab@php.net>2015-11-21 17:47:15 +0100
commit597ed66ade112b4bde671f1e2ee0f1a000d16427 (patch)
tree9769646f7d9e03e39a9854d9085fc77c77b9a864
parent8ae48067b8202fcfb8df2d98b2ad34ac457c67b7 (diff)
downloadphp-git-597ed66ade112b4bde671f1e2ee0f1a000d16427.tar.gz
Fixed bug #70947 (INI parser segfault with INI_SCANNER_TYPED)
-rw-r--r--Zend/zend_ini_parser.y7
-rw-r--r--ext/standard/tests/general_functions/bug70947.phpt12
2 files changed, 18 insertions, 1 deletions
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index e3042b80c1..d6f33159d8 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -109,8 +109,13 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
ZVAL_PSTRINGL(op1, str->val, str->len);
zend_string_release(str);
}
-
op1_len = (int)Z_STRLEN_P(op1);
+
+ if (Z_TYPE_P(op2) != IS_STRING) {
+ zend_string *str = zval_get_string(op2);
+ ZVAL_PSTRINGL(op2, str->val, str->len);
+ zend_string_release(str);
+ }
length = op1_len + (int)Z_STRLEN_P(op2);
ZVAL_NEW_STR(result, zend_string_extend(Z_STR_P(op1), length, 1));
diff --git a/ext/standard/tests/general_functions/bug70947.phpt b/ext/standard/tests/general_functions/bug70947.phpt
new file mode 100644
index 0000000000..d07e5a331f
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug70947.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #70947 (INI parser segfault with INI_SCANNER_TYPED)
+--FILE--
+<?php
+$o = parse_ini_string('foo = bar 123', FALSE, INI_SCANNER_TYPED);
+var_dump($o);
+?>
+--EXPECT--
+array(1) {
+ ["foo"]=>
+ string(7) "bar 123"
+}