1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Add support for binary and octal number prefixes for INI settings

Closes GH-9560
This commit is contained in:
George Peter Banyard
2022-09-16 16:53:43 +01:00
parent d2288ec5ed
commit 0f8b9eb49b
11 changed files with 2456 additions and 13 deletions

View File

@@ -0,0 +1,750 @@
--TEST--
Test parsing of binary quantities
--EXTENSIONS--
zend_test
--FILE--
<?php
// This test checks valid formats do not throw any warnings.
foreach (['', ' '] as $leadingWS) {
foreach (['', '+', '-'] as $sign) {
foreach (['', ' '] as $midWS) {
// Ignore G due to overflow on 32bits
foreach (['', 'K', 'k', 'M', 'm'] as $exp) {
foreach (['', ' '] as $trailingWS) {
$setting = sprintf('%s%s0b11%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
$setting = sprintf('%s%s0B11%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
}
}
}
}
}
--EXPECT--
# "0b11"
int(3)
# "0B11"
int(3)
# "0b11 "
int(3)
# "0B11 "
int(3)
# "0b11K"
int(3072)
# "0B11K"
int(3072)
# "0b11K "
int(3072)
# "0B11K "
int(3072)
# "0b11k"
int(3072)
# "0B11k"
int(3072)
# "0b11k "
int(3072)
# "0B11k "
int(3072)
# "0b11M"
int(3145728)
# "0B11M"
int(3145728)
# "0b11M "
int(3145728)
# "0B11M "
int(3145728)
# "0b11m"
int(3145728)
# "0B11m"
int(3145728)
# "0b11m "
int(3145728)
# "0B11m "
int(3145728)
# "0b11 "
int(3)
# "0B11 "
int(3)
# "0b11 "
int(3)
# "0B11 "
int(3)
# "0b11 K"
int(3072)
# "0B11 K"
int(3072)
# "0b11 K "
int(3072)
# "0B11 K "
int(3072)
# "0b11 k"
int(3072)
# "0B11 k"
int(3072)
# "0b11 k "
int(3072)
# "0B11 k "
int(3072)
# "0b11 M"
int(3145728)
# "0B11 M"
int(3145728)
# "0b11 M "
int(3145728)
# "0B11 M "
int(3145728)
# "0b11 m"
int(3145728)
# "0B11 m"
int(3145728)
# "0b11 m "
int(3145728)
# "0B11 m "
int(3145728)
# "+0b11"
int(3)
# "+0B11"
int(3)
# "+0b11 "
int(3)
# "+0B11 "
int(3)
# "+0b11K"
int(3072)
# "+0B11K"
int(3072)
# "+0b11K "
int(3072)
# "+0B11K "
int(3072)
# "+0b11k"
int(3072)
# "+0B11k"
int(3072)
# "+0b11k "
int(3072)
# "+0B11k "
int(3072)
# "+0b11M"
int(3145728)
# "+0B11M"
int(3145728)
# "+0b11M "
int(3145728)
# "+0B11M "
int(3145728)
# "+0b11m"
int(3145728)
# "+0B11m"
int(3145728)
# "+0b11m "
int(3145728)
# "+0B11m "
int(3145728)
# "+0b11 "
int(3)
# "+0B11 "
int(3)
# "+0b11 "
int(3)
# "+0B11 "
int(3)
# "+0b11 K"
int(3072)
# "+0B11 K"
int(3072)
# "+0b11 K "
int(3072)
# "+0B11 K "
int(3072)
# "+0b11 k"
int(3072)
# "+0B11 k"
int(3072)
# "+0b11 k "
int(3072)
# "+0B11 k "
int(3072)
# "+0b11 M"
int(3145728)
# "+0B11 M"
int(3145728)
# "+0b11 M "
int(3145728)
# "+0B11 M "
int(3145728)
# "+0b11 m"
int(3145728)
# "+0B11 m"
int(3145728)
# "+0b11 m "
int(3145728)
# "+0B11 m "
int(3145728)
# "-0b11"
int(-3)
# "-0B11"
int(-3)
# "-0b11 "
int(-3)
# "-0B11 "
int(-3)
# "-0b11K"
int(-3072)
# "-0B11K"
int(-3072)
# "-0b11K "
int(-3072)
# "-0B11K "
int(-3072)
# "-0b11k"
int(-3072)
# "-0B11k"
int(-3072)
# "-0b11k "
int(-3072)
# "-0B11k "
int(-3072)
# "-0b11M"
int(-3145728)
# "-0B11M"
int(-3145728)
# "-0b11M "
int(-3145728)
# "-0B11M "
int(-3145728)
# "-0b11m"
int(-3145728)
# "-0B11m"
int(-3145728)
# "-0b11m "
int(-3145728)
# "-0B11m "
int(-3145728)
# "-0b11 "
int(-3)
# "-0B11 "
int(-3)
# "-0b11 "
int(-3)
# "-0B11 "
int(-3)
# "-0b11 K"
int(-3072)
# "-0B11 K"
int(-3072)
# "-0b11 K "
int(-3072)
# "-0B11 K "
int(-3072)
# "-0b11 k"
int(-3072)
# "-0B11 k"
int(-3072)
# "-0b11 k "
int(-3072)
# "-0B11 k "
int(-3072)
# "-0b11 M"
int(-3145728)
# "-0B11 M"
int(-3145728)
# "-0b11 M "
int(-3145728)
# "-0B11 M "
int(-3145728)
# "-0b11 m"
int(-3145728)
# "-0B11 m"
int(-3145728)
# "-0b11 m "
int(-3145728)
# "-0B11 m "
int(-3145728)
# " 0b11"
int(3)
# " 0B11"
int(3)
# " 0b11 "
int(3)
# " 0B11 "
int(3)
# " 0b11K"
int(3072)
# " 0B11K"
int(3072)
# " 0b11K "
int(3072)
# " 0B11K "
int(3072)
# " 0b11k"
int(3072)
# " 0B11k"
int(3072)
# " 0b11k "
int(3072)
# " 0B11k "
int(3072)
# " 0b11M"
int(3145728)
# " 0B11M"
int(3145728)
# " 0b11M "
int(3145728)
# " 0B11M "
int(3145728)
# " 0b11m"
int(3145728)
# " 0B11m"
int(3145728)
# " 0b11m "
int(3145728)
# " 0B11m "
int(3145728)
# " 0b11 "
int(3)
# " 0B11 "
int(3)
# " 0b11 "
int(3)
# " 0B11 "
int(3)
# " 0b11 K"
int(3072)
# " 0B11 K"
int(3072)
# " 0b11 K "
int(3072)
# " 0B11 K "
int(3072)
# " 0b11 k"
int(3072)
# " 0B11 k"
int(3072)
# " 0b11 k "
int(3072)
# " 0B11 k "
int(3072)
# " 0b11 M"
int(3145728)
# " 0B11 M"
int(3145728)
# " 0b11 M "
int(3145728)
# " 0B11 M "
int(3145728)
# " 0b11 m"
int(3145728)
# " 0B11 m"
int(3145728)
# " 0b11 m "
int(3145728)
# " 0B11 m "
int(3145728)
# " +0b11"
int(3)
# " +0B11"
int(3)
# " +0b11 "
int(3)
# " +0B11 "
int(3)
# " +0b11K"
int(3072)
# " +0B11K"
int(3072)
# " +0b11K "
int(3072)
# " +0B11K "
int(3072)
# " +0b11k"
int(3072)
# " +0B11k"
int(3072)
# " +0b11k "
int(3072)
# " +0B11k "
int(3072)
# " +0b11M"
int(3145728)
# " +0B11M"
int(3145728)
# " +0b11M "
int(3145728)
# " +0B11M "
int(3145728)
# " +0b11m"
int(3145728)
# " +0B11m"
int(3145728)
# " +0b11m "
int(3145728)
# " +0B11m "
int(3145728)
# " +0b11 "
int(3)
# " +0B11 "
int(3)
# " +0b11 "
int(3)
# " +0B11 "
int(3)
# " +0b11 K"
int(3072)
# " +0B11 K"
int(3072)
# " +0b11 K "
int(3072)
# " +0B11 K "
int(3072)
# " +0b11 k"
int(3072)
# " +0B11 k"
int(3072)
# " +0b11 k "
int(3072)
# " +0B11 k "
int(3072)
# " +0b11 M"
int(3145728)
# " +0B11 M"
int(3145728)
# " +0b11 M "
int(3145728)
# " +0B11 M "
int(3145728)
# " +0b11 m"
int(3145728)
# " +0B11 m"
int(3145728)
# " +0b11 m "
int(3145728)
# " +0B11 m "
int(3145728)
# " -0b11"
int(-3)
# " -0B11"
int(-3)
# " -0b11 "
int(-3)
# " -0B11 "
int(-3)
# " -0b11K"
int(-3072)
# " -0B11K"
int(-3072)
# " -0b11K "
int(-3072)
# " -0B11K "
int(-3072)
# " -0b11k"
int(-3072)
# " -0B11k"
int(-3072)
# " -0b11k "
int(-3072)
# " -0B11k "
int(-3072)
# " -0b11M"
int(-3145728)
# " -0B11M"
int(-3145728)
# " -0b11M "
int(-3145728)
# " -0B11M "
int(-3145728)
# " -0b11m"
int(-3145728)
# " -0B11m"
int(-3145728)
# " -0b11m "
int(-3145728)
# " -0B11m "
int(-3145728)
# " -0b11 "
int(-3)
# " -0B11 "
int(-3)
# " -0b11 "
int(-3)
# " -0B11 "
int(-3)
# " -0b11 K"
int(-3072)
# " -0B11 K"
int(-3072)
# " -0b11 K "
int(-3072)
# " -0B11 K "
int(-3072)
# " -0b11 k"
int(-3072)
# " -0B11 k"
int(-3072)
# " -0b11 k "
int(-3072)
# " -0B11 k "
int(-3072)
# " -0b11 M"
int(-3145728)
# " -0B11 M"
int(-3145728)
# " -0b11 M "
int(-3145728)
# " -0B11 M "
int(-3145728)
# " -0b11 m"
int(-3145728)
# " -0B11 m"
int(-3145728)
# " -0b11 m "
int(-3145728)
# " -0B11 m "
int(-3145728)

View File

@@ -13,6 +13,15 @@ $tests = [
'1X', # Unknown multiplier.
'1.0K', # Non integral digits.
'0X', # Valid prefix with no value
'0Z', # Invalid prefix
'0XK', # Valid prefix with no value and multiplier
'++',
'-+',
'+ 25',
'- 25',
# Null bytes
" 123\x00K",
"\x00 123K",
@@ -48,6 +57,41 @@ int(1)
Warning: Invalid quantity "1.0K", interpreting as "1K" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(1024)
# "0X"
Warning: Invalid quantity "0X": no digits after base prefix, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "0Z"
Warning: Invalid prefix "0Z", interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "0XK"
Warning: Invalid quantity "0XK": no valid leading digits, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "++"
Warning: Invalid quantity "++": no valid leading digits, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "-+"
Warning: Invalid quantity "-+": no valid leading digits, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "+ 25"
Warning: Invalid quantity "+ 25": no valid leading digits, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# "- 25"
Warning: Invalid quantity "- 25": no valid leading digits, interpreting as "0" for backwards compatibility in %s%ezend_ini_parse_quantity_error.php on line %d
int(0)
# " 123\000K"
Warning: Invalid quantity " 123\x00K", interpreting as " 123K" for backwards compatibility in %s on line %d

View File

@@ -0,0 +1,750 @@
--TEST--
Test parsing of hexadecimal quantities
--EXTENSIONS--
zend_test
--FILE--
<?php
// This test checks valid formats do not throw any warnings.
foreach (['', ' '] as $leadingWS) {
foreach (['', '+', '-'] as $sign) {
foreach (['', ' '] as $midWS) {
// Ignore G due to overflow on 32bits
foreach (['', 'K', 'k', 'M', 'm'] as $exp) {
foreach (['', ' '] as $trailingWS) {
$setting = sprintf('%s%s0x1F%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
$setting = sprintf('%s%s0X1F%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
}
}
}
}
}
--EXPECT--
# "0x1F"
int(31)
# "0X1F"
int(31)
# "0x1F "
int(31)
# "0X1F "
int(31)
# "0x1FK"
int(31744)
# "0X1FK"
int(31744)
# "0x1FK "
int(31744)
# "0X1FK "
int(31744)
# "0x1Fk"
int(31744)
# "0X1Fk"
int(31744)
# "0x1Fk "
int(31744)
# "0X1Fk "
int(31744)
# "0x1FM"
int(32505856)
# "0X1FM"
int(32505856)
# "0x1FM "
int(32505856)
# "0X1FM "
int(32505856)
# "0x1Fm"
int(32505856)
# "0X1Fm"
int(32505856)
# "0x1Fm "
int(32505856)
# "0X1Fm "
int(32505856)
# "0x1F "
int(31)
# "0X1F "
int(31)
# "0x1F "
int(31)
# "0X1F "
int(31)
# "0x1F K"
int(31744)
# "0X1F K"
int(31744)
# "0x1F K "
int(31744)
# "0X1F K "
int(31744)
# "0x1F k"
int(31744)
# "0X1F k"
int(31744)
# "0x1F k "
int(31744)
# "0X1F k "
int(31744)
# "0x1F M"
int(32505856)
# "0X1F M"
int(32505856)
# "0x1F M "
int(32505856)
# "0X1F M "
int(32505856)
# "0x1F m"
int(32505856)
# "0X1F m"
int(32505856)
# "0x1F m "
int(32505856)
# "0X1F m "
int(32505856)
# "+0x1F"
int(31)
# "+0X1F"
int(31)
# "+0x1F "
int(31)
# "+0X1F "
int(31)
# "+0x1FK"
int(31744)
# "+0X1FK"
int(31744)
# "+0x1FK "
int(31744)
# "+0X1FK "
int(31744)
# "+0x1Fk"
int(31744)
# "+0X1Fk"
int(31744)
# "+0x1Fk "
int(31744)
# "+0X1Fk "
int(31744)
# "+0x1FM"
int(32505856)
# "+0X1FM"
int(32505856)
# "+0x1FM "
int(32505856)
# "+0X1FM "
int(32505856)
# "+0x1Fm"
int(32505856)
# "+0X1Fm"
int(32505856)
# "+0x1Fm "
int(32505856)
# "+0X1Fm "
int(32505856)
# "+0x1F "
int(31)
# "+0X1F "
int(31)
# "+0x1F "
int(31)
# "+0X1F "
int(31)
# "+0x1F K"
int(31744)
# "+0X1F K"
int(31744)
# "+0x1F K "
int(31744)
# "+0X1F K "
int(31744)
# "+0x1F k"
int(31744)
# "+0X1F k"
int(31744)
# "+0x1F k "
int(31744)
# "+0X1F k "
int(31744)
# "+0x1F M"
int(32505856)
# "+0X1F M"
int(32505856)
# "+0x1F M "
int(32505856)
# "+0X1F M "
int(32505856)
# "+0x1F m"
int(32505856)
# "+0X1F m"
int(32505856)
# "+0x1F m "
int(32505856)
# "+0X1F m "
int(32505856)
# "-0x1F"
int(-31)
# "-0X1F"
int(-31)
# "-0x1F "
int(-31)
# "-0X1F "
int(-31)
# "-0x1FK"
int(-31744)
# "-0X1FK"
int(-31744)
# "-0x1FK "
int(-31744)
# "-0X1FK "
int(-31744)
# "-0x1Fk"
int(-31744)
# "-0X1Fk"
int(-31744)
# "-0x1Fk "
int(-31744)
# "-0X1Fk "
int(-31744)
# "-0x1FM"
int(-32505856)
# "-0X1FM"
int(-32505856)
# "-0x1FM "
int(-32505856)
# "-0X1FM "
int(-32505856)
# "-0x1Fm"
int(-32505856)
# "-0X1Fm"
int(-32505856)
# "-0x1Fm "
int(-32505856)
# "-0X1Fm "
int(-32505856)
# "-0x1F "
int(-31)
# "-0X1F "
int(-31)
# "-0x1F "
int(-31)
# "-0X1F "
int(-31)
# "-0x1F K"
int(-31744)
# "-0X1F K"
int(-31744)
# "-0x1F K "
int(-31744)
# "-0X1F K "
int(-31744)
# "-0x1F k"
int(-31744)
# "-0X1F k"
int(-31744)
# "-0x1F k "
int(-31744)
# "-0X1F k "
int(-31744)
# "-0x1F M"
int(-32505856)
# "-0X1F M"
int(-32505856)
# "-0x1F M "
int(-32505856)
# "-0X1F M "
int(-32505856)
# "-0x1F m"
int(-32505856)
# "-0X1F m"
int(-32505856)
# "-0x1F m "
int(-32505856)
# "-0X1F m "
int(-32505856)
# " 0x1F"
int(31)
# " 0X1F"
int(31)
# " 0x1F "
int(31)
# " 0X1F "
int(31)
# " 0x1FK"
int(31744)
# " 0X1FK"
int(31744)
# " 0x1FK "
int(31744)
# " 0X1FK "
int(31744)
# " 0x1Fk"
int(31744)
# " 0X1Fk"
int(31744)
# " 0x1Fk "
int(31744)
# " 0X1Fk "
int(31744)
# " 0x1FM"
int(32505856)
# " 0X1FM"
int(32505856)
# " 0x1FM "
int(32505856)
# " 0X1FM "
int(32505856)
# " 0x1Fm"
int(32505856)
# " 0X1Fm"
int(32505856)
# " 0x1Fm "
int(32505856)
# " 0X1Fm "
int(32505856)
# " 0x1F "
int(31)
# " 0X1F "
int(31)
# " 0x1F "
int(31)
# " 0X1F "
int(31)
# " 0x1F K"
int(31744)
# " 0X1F K"
int(31744)
# " 0x1F K "
int(31744)
# " 0X1F K "
int(31744)
# " 0x1F k"
int(31744)
# " 0X1F k"
int(31744)
# " 0x1F k "
int(31744)
# " 0X1F k "
int(31744)
# " 0x1F M"
int(32505856)
# " 0X1F M"
int(32505856)
# " 0x1F M "
int(32505856)
# " 0X1F M "
int(32505856)
# " 0x1F m"
int(32505856)
# " 0X1F m"
int(32505856)
# " 0x1F m "
int(32505856)
# " 0X1F m "
int(32505856)
# " +0x1F"
int(31)
# " +0X1F"
int(31)
# " +0x1F "
int(31)
# " +0X1F "
int(31)
# " +0x1FK"
int(31744)
# " +0X1FK"
int(31744)
# " +0x1FK "
int(31744)
# " +0X1FK "
int(31744)
# " +0x1Fk"
int(31744)
# " +0X1Fk"
int(31744)
# " +0x1Fk "
int(31744)
# " +0X1Fk "
int(31744)
# " +0x1FM"
int(32505856)
# " +0X1FM"
int(32505856)
# " +0x1FM "
int(32505856)
# " +0X1FM "
int(32505856)
# " +0x1Fm"
int(32505856)
# " +0X1Fm"
int(32505856)
# " +0x1Fm "
int(32505856)
# " +0X1Fm "
int(32505856)
# " +0x1F "
int(31)
# " +0X1F "
int(31)
# " +0x1F "
int(31)
# " +0X1F "
int(31)
# " +0x1F K"
int(31744)
# " +0X1F K"
int(31744)
# " +0x1F K "
int(31744)
# " +0X1F K "
int(31744)
# " +0x1F k"
int(31744)
# " +0X1F k"
int(31744)
# " +0x1F k "
int(31744)
# " +0X1F k "
int(31744)
# " +0x1F M"
int(32505856)
# " +0X1F M"
int(32505856)
# " +0x1F M "
int(32505856)
# " +0X1F M "
int(32505856)
# " +0x1F m"
int(32505856)
# " +0X1F m"
int(32505856)
# " +0x1F m "
int(32505856)
# " +0X1F m "
int(32505856)
# " -0x1F"
int(-31)
# " -0X1F"
int(-31)
# " -0x1F "
int(-31)
# " -0X1F "
int(-31)
# " -0x1FK"
int(-31744)
# " -0X1FK"
int(-31744)
# " -0x1FK "
int(-31744)
# " -0X1FK "
int(-31744)
# " -0x1Fk"
int(-31744)
# " -0X1Fk"
int(-31744)
# " -0x1Fk "
int(-31744)
# " -0X1Fk "
int(-31744)
# " -0x1FM"
int(-32505856)
# " -0X1FM"
int(-32505856)
# " -0x1FM "
int(-32505856)
# " -0X1FM "
int(-32505856)
# " -0x1Fm"
int(-32505856)
# " -0X1Fm"
int(-32505856)
# " -0x1Fm "
int(-32505856)
# " -0X1Fm "
int(-32505856)
# " -0x1F "
int(-31)
# " -0X1F "
int(-31)
# " -0x1F "
int(-31)
# " -0X1F "
int(-31)
# " -0x1F K"
int(-31744)
# " -0X1F K"
int(-31744)
# " -0x1F K "
int(-31744)
# " -0X1F K "
int(-31744)
# " -0x1F k"
int(-31744)
# " -0X1F k"
int(-31744)
# " -0x1F k "
int(-31744)
# " -0X1F k "
int(-31744)
# " -0x1F M"
int(-32505856)
# " -0X1F M"
int(-32505856)
# " -0x1F M "
int(-32505856)
# " -0X1F M "
int(-32505856)
# " -0x1F m"
int(-32505856)
# " -0X1F m"
int(-32505856)
# " -0x1F m "
int(-32505856)
# " -0X1F m "
int(-32505856)

View File

@@ -0,0 +1,750 @@
--TEST--
Test parsing of octal quantities
--EXTENSIONS--
zend_test
--FILE--
<?php
// This test checks valid formats do not throw any warnings.
foreach (['', ' '] as $leadingWS) {
foreach (['', '+', '-'] as $sign) {
foreach (['', ' '] as $midWS) {
// Ignore G due to overflow on 32bits
foreach (['', 'K', 'k', 'M', 'm'] as $exp) {
foreach (['', ' '] as $trailingWS) {
$setting = sprintf('%s%s0o14%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
$setting = sprintf('%s%s0O14%s%s%s',
$leadingWS, $sign, $midWS, $exp, $trailingWS);
printf("# \"%s\"\n", $setting);
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
}
}
}
}
}
--EXPECT--
# "0o14"
int(12)
# "0O14"
int(12)
# "0o14 "
int(12)
# "0O14 "
int(12)
# "0o14K"
int(12288)
# "0O14K"
int(12288)
# "0o14K "
int(12288)
# "0O14K "
int(12288)
# "0o14k"
int(12288)
# "0O14k"
int(12288)
# "0o14k "
int(12288)
# "0O14k "
int(12288)
# "0o14M"
int(12582912)
# "0O14M"
int(12582912)
# "0o14M "
int(12582912)
# "0O14M "
int(12582912)
# "0o14m"
int(12582912)
# "0O14m"
int(12582912)
# "0o14m "
int(12582912)
# "0O14m "
int(12582912)
# "0o14 "
int(12)
# "0O14 "
int(12)
# "0o14 "
int(12)
# "0O14 "
int(12)
# "0o14 K"
int(12288)
# "0O14 K"
int(12288)
# "0o14 K "
int(12288)
# "0O14 K "
int(12288)
# "0o14 k"
int(12288)
# "0O14 k"
int(12288)
# "0o14 k "
int(12288)
# "0O14 k "
int(12288)
# "0o14 M"
int(12582912)
# "0O14 M"
int(12582912)
# "0o14 M "
int(12582912)
# "0O14 M "
int(12582912)
# "0o14 m"
int(12582912)
# "0O14 m"
int(12582912)
# "0o14 m "
int(12582912)
# "0O14 m "
int(12582912)
# "+0o14"
int(12)
# "+0O14"
int(12)
# "+0o14 "
int(12)
# "+0O14 "
int(12)
# "+0o14K"
int(12288)
# "+0O14K"
int(12288)
# "+0o14K "
int(12288)
# "+0O14K "
int(12288)
# "+0o14k"
int(12288)
# "+0O14k"
int(12288)
# "+0o14k "
int(12288)
# "+0O14k "
int(12288)
# "+0o14M"
int(12582912)
# "+0O14M"
int(12582912)
# "+0o14M "
int(12582912)
# "+0O14M "
int(12582912)
# "+0o14m"
int(12582912)
# "+0O14m"
int(12582912)
# "+0o14m "
int(12582912)
# "+0O14m "
int(12582912)
# "+0o14 "
int(12)
# "+0O14 "
int(12)
# "+0o14 "
int(12)
# "+0O14 "
int(12)
# "+0o14 K"
int(12288)
# "+0O14 K"
int(12288)
# "+0o14 K "
int(12288)
# "+0O14 K "
int(12288)
# "+0o14 k"
int(12288)
# "+0O14 k"
int(12288)
# "+0o14 k "
int(12288)
# "+0O14 k "
int(12288)
# "+0o14 M"
int(12582912)
# "+0O14 M"
int(12582912)
# "+0o14 M "
int(12582912)
# "+0O14 M "
int(12582912)
# "+0o14 m"
int(12582912)
# "+0O14 m"
int(12582912)
# "+0o14 m "
int(12582912)
# "+0O14 m "
int(12582912)
# "-0o14"
int(-12)
# "-0O14"
int(-12)
# "-0o14 "
int(-12)
# "-0O14 "
int(-12)
# "-0o14K"
int(-12288)
# "-0O14K"
int(-12288)
# "-0o14K "
int(-12288)
# "-0O14K "
int(-12288)
# "-0o14k"
int(-12288)
# "-0O14k"
int(-12288)
# "-0o14k "
int(-12288)
# "-0O14k "
int(-12288)
# "-0o14M"
int(-12582912)
# "-0O14M"
int(-12582912)
# "-0o14M "
int(-12582912)
# "-0O14M "
int(-12582912)
# "-0o14m"
int(-12582912)
# "-0O14m"
int(-12582912)
# "-0o14m "
int(-12582912)
# "-0O14m "
int(-12582912)
# "-0o14 "
int(-12)
# "-0O14 "
int(-12)
# "-0o14 "
int(-12)
# "-0O14 "
int(-12)
# "-0o14 K"
int(-12288)
# "-0O14 K"
int(-12288)
# "-0o14 K "
int(-12288)
# "-0O14 K "
int(-12288)
# "-0o14 k"
int(-12288)
# "-0O14 k"
int(-12288)
# "-0o14 k "
int(-12288)
# "-0O14 k "
int(-12288)
# "-0o14 M"
int(-12582912)
# "-0O14 M"
int(-12582912)
# "-0o14 M "
int(-12582912)
# "-0O14 M "
int(-12582912)
# "-0o14 m"
int(-12582912)
# "-0O14 m"
int(-12582912)
# "-0o14 m "
int(-12582912)
# "-0O14 m "
int(-12582912)
# " 0o14"
int(12)
# " 0O14"
int(12)
# " 0o14 "
int(12)
# " 0O14 "
int(12)
# " 0o14K"
int(12288)
# " 0O14K"
int(12288)
# " 0o14K "
int(12288)
# " 0O14K "
int(12288)
# " 0o14k"
int(12288)
# " 0O14k"
int(12288)
# " 0o14k "
int(12288)
# " 0O14k "
int(12288)
# " 0o14M"
int(12582912)
# " 0O14M"
int(12582912)
# " 0o14M "
int(12582912)
# " 0O14M "
int(12582912)
# " 0o14m"
int(12582912)
# " 0O14m"
int(12582912)
# " 0o14m "
int(12582912)
# " 0O14m "
int(12582912)
# " 0o14 "
int(12)
# " 0O14 "
int(12)
# " 0o14 "
int(12)
# " 0O14 "
int(12)
# " 0o14 K"
int(12288)
# " 0O14 K"
int(12288)
# " 0o14 K "
int(12288)
# " 0O14 K "
int(12288)
# " 0o14 k"
int(12288)
# " 0O14 k"
int(12288)
# " 0o14 k "
int(12288)
# " 0O14 k "
int(12288)
# " 0o14 M"
int(12582912)
# " 0O14 M"
int(12582912)
# " 0o14 M "
int(12582912)
# " 0O14 M "
int(12582912)
# " 0o14 m"
int(12582912)
# " 0O14 m"
int(12582912)
# " 0o14 m "
int(12582912)
# " 0O14 m "
int(12582912)
# " +0o14"
int(12)
# " +0O14"
int(12)
# " +0o14 "
int(12)
# " +0O14 "
int(12)
# " +0o14K"
int(12288)
# " +0O14K"
int(12288)
# " +0o14K "
int(12288)
# " +0O14K "
int(12288)
# " +0o14k"
int(12288)
# " +0O14k"
int(12288)
# " +0o14k "
int(12288)
# " +0O14k "
int(12288)
# " +0o14M"
int(12582912)
# " +0O14M"
int(12582912)
# " +0o14M "
int(12582912)
# " +0O14M "
int(12582912)
# " +0o14m"
int(12582912)
# " +0O14m"
int(12582912)
# " +0o14m "
int(12582912)
# " +0O14m "
int(12582912)
# " +0o14 "
int(12)
# " +0O14 "
int(12)
# " +0o14 "
int(12)
# " +0O14 "
int(12)
# " +0o14 K"
int(12288)
# " +0O14 K"
int(12288)
# " +0o14 K "
int(12288)
# " +0O14 K "
int(12288)
# " +0o14 k"
int(12288)
# " +0O14 k"
int(12288)
# " +0o14 k "
int(12288)
# " +0O14 k "
int(12288)
# " +0o14 M"
int(12582912)
# " +0O14 M"
int(12582912)
# " +0o14 M "
int(12582912)
# " +0O14 M "
int(12582912)
# " +0o14 m"
int(12582912)
# " +0O14 m"
int(12582912)
# " +0o14 m "
int(12582912)
# " +0O14 m "
int(12582912)
# " -0o14"
int(-12)
# " -0O14"
int(-12)
# " -0o14 "
int(-12)
# " -0O14 "
int(-12)
# " -0o14K"
int(-12288)
# " -0O14K"
int(-12288)
# " -0o14K "
int(-12288)
# " -0O14K "
int(-12288)
# " -0o14k"
int(-12288)
# " -0O14k"
int(-12288)
# " -0o14k "
int(-12288)
# " -0O14k "
int(-12288)
# " -0o14M"
int(-12582912)
# " -0O14M"
int(-12582912)
# " -0o14M "
int(-12582912)
# " -0O14M "
int(-12582912)
# " -0o14m"
int(-12582912)
# " -0O14m"
int(-12582912)
# " -0o14m "
int(-12582912)
# " -0O14m "
int(-12582912)
# " -0o14 "
int(-12)
# " -0O14 "
int(-12)
# " -0o14 "
int(-12)
# " -0O14 "
int(-12)
# " -0o14 K"
int(-12288)
# " -0O14 K"
int(-12288)
# " -0o14 K "
int(-12288)
# " -0O14 K "
int(-12288)
# " -0o14 k"
int(-12288)
# " -0O14 k"
int(-12288)
# " -0o14 k "
int(-12288)
# " -0O14 k "
int(-12288)
# " -0o14 M"
int(-12582912)
# " -0O14 M"
int(-12582912)
# " -0o14 M "
int(-12582912)
# " -0O14 M "
int(-12582912)
# " -0o14 m"
int(-12582912)
# " -0O14 m"
int(-12582912)
# " -0o14 m "
int(-12582912)
# " -0O14 m "
int(-12582912)

View File

@@ -0,0 +1,71 @@
--TEST--
Test parsing of valid 0 quantities
--EXTENSIONS--
zend_test
--FILE--
<?php
$tests = [
'0',
'0K',
'0k',
'0M',
'0m',
'0G',
'0g',
'-0',
'-0K',
'-0k',
'-0M',
'-0m',
'-0G',
'-0g',
];
foreach ($tests as $setting) {
printf("# \"%s\"\n", addcslashes($setting, "\0..\37!@\177..\377"));
var_dump(zend_test_zend_ini_parse_quantity($setting));
print "\n";
}
--EXPECT--
# "0"
int(0)
# "0K"
int(0)
# "0k"
int(0)
# "0M"
int(0)
# "0m"
int(0)
# "0G"
int(0)
# "0g"
int(0)
# "-0"
int(0)
# "-0K"
int(0)
# "-0k"
int(0)
# "-0M"
int(0)
# "-0m"
int(0)
# "-0G"
int(0)
# "-0g"
int(0)

View File

@@ -25,6 +25,7 @@
#include "zend_strtod.h"
#include "zend_modules.h"
#include "zend_smart_str.h"
#include <ctype.h>
static HashTable *registered_zend_ini_directives;
@@ -560,33 +561,110 @@ static zend_ulong zend_ini_parse_quantity_internal(zend_string *value, zend_ini_
/* Ignore leading whitespace. ZEND_STRTOL() also skips leading whitespaces,
* but we need the position of the first non-whitespace later. */
while (digits < str_end && zend_is_whitespace(*digits)) ++digits;
while (digits < str_end && zend_is_whitespace(*digits)) {++digits;}
/* Ignore trailing whitespace */
while (digits < str_end && zend_is_whitespace(*(str_end-1))) --str_end;
while (digits < str_end && zend_is_whitespace(*(str_end-1))) {--str_end;}
if (digits == str_end) {
*errstr = NULL;
return 0;
}
zend_ulong retval;
errno = 0;
if (signed_result == ZEND_INI_PARSE_QUANTITY_SIGNED) {
retval = (zend_ulong) ZEND_STRTOL(digits, &digits_end, 0);
} else {
retval = ZEND_STRTOUL(digits, &digits_end, 0);
bool is_negative = false;
if (digits[0] == '+') {
++digits;
} else if (digits[0] == '-') {
is_negative = true;
++digits;
}
/* if there is no digit after +/- */
if (!isdigit(digits[0])) {
/* Escape the string to avoid null bytes and to make non-printable chars
* visible */
smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value));
smart_str_0(&invalid);
*errstr = zend_strpprintf(0, "Invalid quantity \"%s\": no valid leading digits, interpreting as \"0\" for backwards compatibility",
ZSTR_VAL(invalid.s));
smart_str_free(&invalid);
return 0;
}
int base = 0;
if (digits[0] == '0' && !isdigit(digits[1])) {
/* Value is just 0 */
if ((digits+1) == str_end) {
*errstr = NULL;
return 0;
}
switch (digits[1]) {
/* Multiplier suffixes */
case 'g':
case 'G':
case 'm':
case 'M':
case 'k':
case 'K':
goto evaluation;
case 'x':
case 'X':
base = 16;
break;
case 'o':
case 'O':
base = 8;
break;
case 'b':
case 'B':
base = 2;
break;
default:
*errstr = zend_strpprintf(0, "Invalid prefix \"0%c\", interpreting as \"0\" for backwards compatibility",
digits[1]);
return 0;
}
digits += 2;
if (UNEXPECTED(digits == str_end)) {
/* Escape the string to avoid null bytes and to make non-printable chars
* visible */
smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value));
smart_str_0(&invalid);
*errstr = zend_strpprintf(0, "Invalid quantity \"%s\": no digits after base prefix, interpreting as \"0\" for backwards compatibility",
ZSTR_VAL(invalid.s));
smart_str_free(&invalid);
return 0;
}
}
evaluation:
errno = 0;
zend_ulong retval = ZEND_STRTOUL(digits, &digits_end, base);
if (errno == ERANGE) {
overflow = true;
} else if (signed_result == ZEND_INI_PARSE_QUANTITY_UNSIGNED) {
/* ZEND_STRTOUL() does not report a range error when the subject starts
* with a minus sign, so we check this here. Ignore "-1" as it is
* commonly used as max value, for instance in memory_limit=-1. */
if (digits[0] == '-' && !(digits_end - digits == 2 && digits_end == str_end && digits[1] == '1')) {
if (is_negative) {
/* Ignore "-1" as it is commonly used as max value, for instance in memory_limit=-1. */
if (retval == 1 && digits_end == str_end) {
retval = -1;
} else {
overflow = true;
}
}
} else if (signed_result == ZEND_INI_PARSE_QUANTITY_SIGNED) {
/* Handle PHP_INT_MIN case */
if (is_negative && retval == ((zend_ulong)ZEND_LONG_MAX +1)) {
retval = 0u - retval;
} else if ((zend_long) retval < 0) {
overflow = true;
} else if (is_negative) {
retval = 0u - retval;
}
}