diff --git a/UPGRADING b/UPGRADING index e64b65e7b0b8..fa89e5273495 100644 --- a/UPGRADING +++ b/UPGRADING @@ -70,6 +70,8 @@ PHP 8.6 UPGRADE NOTES argument value is passed. . scandir() now raises a ValueError when an invalid $sorting_order argument value is passed. + . parse_ini_file() and parse_ini_string() now raise a ValueError when + an invalid $scanner_mode argument value is passed. - Zip: . ZipArchive::extractTo now raises a TypeError for the diff --git a/Zend/tests/bug61087.phpt b/Zend/tests/bug61087.phpt deleted file mode 100644 index a0375f21bf20..000000000000 --- a/Zend/tests/bug61087.phpt +++ /dev/null @@ -1,10 +0,0 @@ ---TEST-- -Bug #61087 (Memory leak in parse_ini_file when specifying invalid scanner mode) ---FILE-- - ---EXPECTF-- -Warning: Invalid scanner mode in %s on line %d diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index a611433af537..949b8497687b 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2481,6 +2481,16 @@ PHP_FUNCTION(parse_ini_file) RETURN_THROWS(); } + switch (scanner_mode) { + case ZEND_INI_SCANNER_NORMAL: + case ZEND_INI_SCANNER_RAW: + case ZEND_INI_SCANNER_TYPED: + break; + default: + zend_argument_value_error(3, "must be one of INI_SCANNER_NORMAL, INI_SCANNER_RAW, or INI_SCANNER_TYPED"); + RETURN_THROWS(); + } + /* Set callback function */ if (process_sections) { ZVAL_UNDEF(&BG(active_ini_file_section)); @@ -2517,6 +2527,16 @@ PHP_FUNCTION(parse_ini_string) Z_PARAM_LONG(scanner_mode) ZEND_PARSE_PARAMETERS_END(); + switch (scanner_mode) { + case ZEND_INI_SCANNER_NORMAL: + case ZEND_INI_SCANNER_RAW: + case ZEND_INI_SCANNER_TYPED: + break; + default: + zend_argument_value_error(3, "must be one of INI_SCANNER_NORMAL, INI_SCANNER_RAW, or INI_SCANNER_TYPED"); + RETURN_THROWS(); + } + if (INT_MAX - str_len < ZEND_MMAP_AHEAD) { RETVAL_FALSE; } diff --git a/ext/standard/tests/general_functions/parse_ini_file-string_invalid-scanner_mode.phpt b/ext/standard/tests/general_functions/parse_ini_file-string_invalid-scanner_mode.phpt new file mode 100644 index 000000000000..f6ac691b4c09 --- /dev/null +++ b/ext/standard/tests/general_functions/parse_ini_file-string_invalid-scanner_mode.phpt @@ -0,0 +1,23 @@ +--TEST-- +parse_ini_file and parse_ini_string throw ValueError exceptions on invalid $scanner_mode param values +--FILE-- +getMessage(), "\n"; +} + +try { + parse_ini_string('x', scanner_mode: 42); +} catch (Throwable $e) { + echo $e::class . ': '.$e->getMessage(), "\n"; +} + +echo "Done" +?> +--EXPECT-- +ValueError: parse_ini_file(): Argument #3 ($scanner_mode) must be one of INI_SCANNER_NORMAL, INI_SCANNER_RAW, or INI_SCANNER_TYPED +ValueError: parse_ini_string(): Argument #3 ($scanner_mode) must be one of INI_SCANNER_NORMAL, INI_SCANNER_RAW, or INI_SCANNER_TYPED +Done