diff --git a/UPGRADING b/UPGRADING index 37abc121a070..095c52ecbab6 100644 --- a/UPGRADING +++ b/UPGRADING @@ -102,6 +102,9 @@ PHP 8.6 UPGRADE NOTES - Standard: . Form feed (\f) is now added in the default trimmed characters of trim(), rtrim() and ltrim(). RFC: https://wiki.php.net/rfc/trim_form_feed + . sscanf() and fscanf() now make the %c conversion consume whitespace. + Previously, the conversion stopped at whitespace even though %c does not + skip leading whitespace. . array_filter() now raises a ValueError when an invalid $mode argument value is passed. . array_change_key_case() now raises a ValueError when an invalid $case diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 5aeb585fea23..bffd32ab473c 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -777,7 +777,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, break; case 'c': - op = 's'; + op = 'c'; flags |= SCAN_NOSKIP; /*-cc-*/ if (0 == width) { @@ -833,7 +833,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, end = string; while (*end != '\0') { sch = *end; - if ( isspace( (unsigned char)sch ) ) { + if (op == 's' && isspace((unsigned char) sch)) { break; } end++; diff --git a/ext/standard/tests/file/fscanf_variation20.phpt b/ext/standard/tests/file/fscanf_variation20.phpt index 70b13dd55c90..f39df0ecc382 100644 --- a/ext/standard/tests/file/fscanf_variation20.phpt +++ b/ext/standard/tests/file/fscanf_variation20.phpt @@ -710,15 +710,18 @@ bool(false) -- iteration 10 -- array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(2) "-1" + string(3) "-1 +" } array(1) { [0]=> @@ -750,7 +753,8 @@ array(1) { } array(1) { [0]=> - string(3) "250" + string(4) "250 +" } array(1) { [0]=> @@ -766,11 +770,13 @@ array(1) { } array(1) { [0]=> - string(2) "83" + string(3) "83 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> @@ -785,75 +791,93 @@ bool(false) -- iteration 11 -- array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(2) "-1" + string(3) "-1 +" } array(1) { [0]=> - string(11) "-2147483648" + string(12) "-2147483648 +" } array(1) { [0]=> - string(11) "-2147483647" + string(12) "-2147483647 +" } array(1) { [0]=> - string(10) "2147483647" + string(11) "2147483647 +" } array(1) { [0]=> - string(10) "2147483640" + string(11) "2147483640 +" } array(1) { [0]=> - string(4) "4667" + string(5) "4667 +" } array(1) { [0]=> - string(4) "4779" + string(5) "4779 +" } array(1) { [0]=> - string(4) "4095" + string(5) "4095 +" } array(1) { [0]=> - string(3) "250" + string(4) "250 +" } array(1) { [0]=> - string(11) "-2147483648" + string(12) "-2147483648 +" } array(1) { [0]=> - string(10) "2147483647" + string(11) "2147483647 +" } array(1) { [0]=> - string(10) "2147483647" + string(11) "2147483647 +" } array(1) { [0]=> - string(2) "83" + string(3) "83 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(11) "-2147483648" + string(12) "-2147483648 +" } array(1) { [0]=> - string(10) "2147483647" + string(11) "2147483647 +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation21.phpt b/ext/standard/tests/file/fscanf_variation21.phpt index 86968ddd1177..d185cfa64375 100644 --- a/ext/standard/tests/file/fscanf_variation21.phpt +++ b/ext/standard/tests/file/fscanf_variation21.phpt @@ -633,7 +633,8 @@ array(1) { } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> @@ -641,7 +642,8 @@ array(1) { } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> @@ -661,7 +663,8 @@ array(1) { } array(1) { [0]=> - string(2) "10" + string(3) "10 +" } array(1) { [0]=> @@ -672,63 +675,78 @@ bool(false) -- iteration 11 -- array(1) { [0]=> - string(11) "-2147483649" + string(12) "-2147483649 +" } array(1) { [0]=> - string(10) "2147483648" + string(11) "2147483648 +" } array(1) { [0]=> - string(11) "-2147483649" + string(12) "-2147483649 +" } array(1) { [0]=> - string(11) "34359738369" + string(12) "34359738369 +" } array(1) { [0]=> - string(10) "2147483649" + string(11) "2147483649 +" } array(1) { [0]=> - string(11) "-2147483649" + string(12) "-2147483649 +" } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(4) "-0.1" + string(5) "-0.1 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(6) "100000" + string(7) "100000 +" } array(1) { [0]=> - string(8) "-1000000" + string(9) "-1000000 +" } array(1) { [0]=> - string(9) "100000000" + string(10) "100000000 +" } array(1) { [0]=> - string(11) "-1000000000" + string(12) "-1000000000 +" } array(1) { [0]=> - string(2) "10" + string(3) "10 +" } array(1) { [0]=> - string(7) "1050000" + string(8) "1050000 +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation22.phpt b/ext/standard/tests/file/fscanf_variation22.phpt index 87a5fe21bc27..c745f840133f 100644 --- a/ext/standard/tests/file/fscanf_variation22.phpt +++ b/ext/standard/tests/file/fscanf_variation22.phpt @@ -76,7 +76,7 @@ $file_path = __DIR__; $filename = "$file_path/fscanf_variation22.tmp"; unlink($filename); ?> ---EXPECT-- +--EXPECTF-- *** Test fscanf(): different char format types with resource *** -- iteration 1 -- @@ -186,11 +186,13 @@ bool(false) -- iteration 11 -- array(1) { [0]=> - string(8) "Resource" + string(%d) "Resource id #%d +" } array(1) { [0]=> - string(8) "Resource" + string(%d) "Resource id #%d +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation23.phpt b/ext/standard/tests/file/fscanf_variation23.phpt index f7bb4ee55201..3b8d8b6b4ef1 100644 --- a/ext/standard/tests/file/fscanf_variation23.phpt +++ b/ext/standard/tests/file/fscanf_variation23.phpt @@ -557,51 +557,63 @@ bool(false) -- iteration 11 -- array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } array(1) { [0]=> - string(5) "Array" + string(6) "Array +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation24.phpt b/ext/standard/tests/file/fscanf_variation24.phpt index 4c46cf58dad1..c5900eb3523a 100644 --- a/ext/standard/tests/file/fscanf_variation24.phpt +++ b/ext/standard/tests/file/fscanf_variation24.phpt @@ -89,11 +89,13 @@ unlink($filename); -- iteration 1 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -164,11 +166,13 @@ bool(false) -- iteration 2 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -239,11 +243,13 @@ bool(false) -- iteration 3 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -314,11 +320,13 @@ bool(false) -- iteration 4 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -458,11 +466,13 @@ bool(false) -- iteration 6 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -692,31 +702,38 @@ bool(false) -- iteration 10 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(1) "" + string(2) " +" } array(1) { [0]=> @@ -724,11 +741,13 @@ array(1) { } array(1) { [0]=> - string(1) "" + string(2) " +" } array(1) { [0]=> - string(3) "\01" + string(4) "\01 +" } array(1) { [0]=> @@ -767,75 +786,93 @@ bool(false) -- iteration 11 -- array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "0" + string(2) "0 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(1) "" + string(2) " +" } array(1) { [0]=> - string(4) "\x01" + string(5) "\x01 +" } array(1) { [0]=> - string(1) "" + string(2) " +" } array(1) { [0]=> - string(3) "\01" + string(4) "\01 +" } array(1) { [0]=> - string(6) "string" + string(7) "string +" } array(1) { [0]=> - string(6) "string" + string(7) "string +" } array(1) { [0]=> - string(4) "true" + string(5) "true +" } array(1) { [0]=> - string(5) "FALSE" + string(6) "FALSE +" } array(1) { [0]=> - string(5) "false" + string(6) "false +" } array(1) { [0]=> - string(4) "TRUE" + string(5) "TRUE +" } array(1) { [0]=> - string(4) "NULL" + string(5) "NULL +" } array(1) { [0]=> - string(4) "null" + string(5) "null +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation25.phpt b/ext/standard/tests/file/fscanf_variation25.phpt index dc9d9936022f..03abeb962a7d 100644 --- a/ext/standard/tests/file/fscanf_variation25.phpt +++ b/ext/standard/tests/file/fscanf_variation25.phpt @@ -79,7 +79,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -87,7 +88,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) @@ -98,7 +100,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -106,7 +109,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) @@ -117,7 +121,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -125,7 +130,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) @@ -136,7 +142,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -144,7 +151,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) @@ -168,7 +176,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> @@ -176,7 +185,8 @@ array(1) { } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) @@ -216,38 +226,46 @@ bool(false) -- iteration 10 -- array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) -- iteration 11 -- array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(0) "" + string(1) " +" } array(1) { [0]=> - string(1) "1" + string(2) "1 +" } array(1) { [0]=> - string(0) "" + string(1) " +" } bool(false) diff --git a/ext/standard/tests/file/fscanf_variation26.phpt b/ext/standard/tests/file/fscanf_variation26.phpt index 19db8f45abfd..6302f64f087c 100644 --- a/ext/standard/tests/file/fscanf_variation26.phpt +++ b/ext/standard/tests/file/fscanf_variation26.phpt @@ -262,46 +262,56 @@ bool(false) -- iteration 10 -- array(1) { [0]=> - string(1) "a" + string(2) "a +" } array(1) { [0]=> - string(1) "a" + string(2) "a +" } array(1) { [0]=> - string(2) "67" + string(3) "67 +" } array(1) { [0]=> - string(3) "-67" + string(4) "-67 +" } array(1) { [0]=> - string(2) "99" + string(3) "99 +" } bool(false) -- iteration 11 -- array(1) { [0]=> - string(1) "a" + string(2) "a +" } array(1) { [0]=> - string(1) "a" + string(2) "a +" } array(1) { [0]=> - string(2) "67" + string(3) "67 +" } array(1) { [0]=> - string(3) "-67" + string(4) "-67 +" } array(1) { [0]=> - string(2) "99" + string(3) "99 +" } bool(false) diff --git a/ext/standard/tests/strings/gh19088.phpt b/ext/standard/tests/strings/gh19088.phpt new file mode 100644 index 000000000000..5e645391c12f --- /dev/null +++ b/ext/standard/tests/strings/gh19088.phpt @@ -0,0 +1,33 @@ +--TEST-- +GH-19088 (sscanf %c conversion should read whitespace) +--FILE-- + +--EXPECT-- +int(2) +string(1) " " +int(1) +array(2) { + [0]=> + string(3) " " + [1]=> + int(3) +} +int(1) +string(5) "hi wo" +int(1) +string(1) "a"