diff --git a/Zend/tests/bug77589.phpt b/Zend/tests/bug77589.phpt new file mode 100644 index 00000000000..ad07ee1351a --- /dev/null +++ b/Zend/tests/bug77589.phpt @@ -0,0 +1,40 @@ +--TEST-- +BUG #77589 (Core dump using parse_ini_string with numeric sections) +--FILE-- + +--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 23a5a7f14c9..e2759b5aa74 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -140,13 +140,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)