summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2020-02-10 13:02:45 +0800
committerXinchen Hui <laruence@gmail.com>2020-02-10 13:02:45 +0800
commit421a7342fe5a10de38cad88e30c0f0ccdab1292b (patch)
tree0769aded614eec950c73e7f96b469f181759526d
parent86780ff79f041e2507b90f65145d87d493de89e5 (diff)
parent6295ff77b780705d132b15990c2904d2fe596e57 (diff)
downloadphp-git-421a7342fe5a10de38cad88e30c0f0ccdab1292b.tar.gz
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #79244 (php crashes during parsing INI file). (Laruence)
-rw-r--r--Zend/tests/bug77589.phpt40
-rw-r--r--Zend/zend_ini_scanner.l15
2 files changed, 48 insertions, 7 deletions
diff --git a/Zend/tests/bug77589.phpt b/Zend/tests/bug77589.phpt
new file mode 100644
index 0000000000..ad07ee1351
--- /dev/null
+++ b/Zend/tests/bug77589.phpt
@@ -0,0 +1,40 @@
+--TEST--
+BUG #77589 (Core dump using parse_ini_string with numeric sections)
+--FILE--
+<?php
+var_dump(
+ parse_ini_string(<<<INI
+[0]
+a = 1
+b = on
+c = true
+
+["true"]
+a = 100
+b = null
+c = yes
+INI
+, TRUE, INI_SCANNER_TYPED));
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ array(3) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ bool(true)
+ ["c"]=>
+ bool(true)
+ }
+ ["true"]=>
+ array(3) {
+ ["a"]=>
+ int(100)
+ ["b"]=>
+ NULL
+ ["c"]=>
+ bool(true)
+ }
+}
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index f71f0b9193..1f4bc34742 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -141,13 +141,14 @@ ZEND_API zend_ini_scanner_globals ini_scanner_globals;
ZVAL_NEW_STR(retval, zend_string_init(str, len, ZEND_SYSTEM_INI))
-#define RETURN_TOKEN(type, str, len) { \
- if (SCNG(scanner_mode) == ZEND_INI_SCANNER_TYPED) { \
- zend_ini_copy_typed_value(ini_lval, type, str, len); \
- } else { \
- zend_ini_copy_value(ini_lval, str, len); \
- } \
- return type; \
+#define RETURN_TOKEN(type, str, len) { \
+ if (SCNG(scanner_mode) == ZEND_INI_SCANNER_TYPED && \
+ (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW))) {\
+ zend_ini_copy_typed_value(ini_lval, type, str, len); \
+ } else { \
+ zend_ini_copy_value(ini_lval, str, len); \
+ } \
+ return type; \
}
static inline int convert_to_number(zval *retval, const char *str, const int str_len)