Skip to content

Commit ff5fd50

Browse files
committed
Fix sscanf %c whitespace handling
Keep the %c conversion separate from %s so it reads whitespace instead of stopping at it. The %c conversion already suppresses leading whitespace skipping; it also must not treat whitespace as the end of the field.
1 parent bba2dc3 commit ff5fd50

9 files changed

Lines changed: 268 additions & 124 deletions

ext/standard/scanf.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format,
777777
break;
778778

779779
case 'c':
780-
op = 's';
780+
op = 'c';
781781
flags |= SCAN_NOSKIP;
782782
/*-cc-*/
783783
if (0 == width) {
@@ -833,7 +833,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format,
833833
end = string;
834834
while (*end != '\0') {
835835
sch = *end;
836-
if ( isspace( (unsigned char)sch ) ) {
836+
if (op == 's' && isspace((unsigned char) sch)) {
837837
break;
838838
}
839839
end++;

ext/standard/tests/file/fscanf_variation20.phpt

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -710,15 +710,18 @@ bool(false)
710710
-- iteration 10 --
711711
array(1) {
712712
[0]=>
713-
string(1) "0"
713+
string(2) "0
714+
"
714715
}
715716
array(1) {
716717
[0]=>
717-
string(1) "1"
718+
string(2) "1
719+
"
718720
}
719721
array(1) {
720722
[0]=>
721-
string(2) "-1"
723+
string(3) "-1
724+
"
722725
}
723726
array(1) {
724727
[0]=>
@@ -750,7 +753,8 @@ array(1) {
750753
}
751754
array(1) {
752755
[0]=>
753-
string(3) "250"
756+
string(4) "250
757+
"
754758
}
755759
array(1) {
756760
[0]=>
@@ -766,11 +770,13 @@ array(1) {
766770
}
767771
array(1) {
768772
[0]=>
769-
string(2) "83"
773+
string(3) "83
774+
"
770775
}
771776
array(1) {
772777
[0]=>
773-
string(1) "1"
778+
string(2) "1
779+
"
774780
}
775781
array(1) {
776782
[0]=>
@@ -785,75 +791,93 @@ bool(false)
785791
-- iteration 11 --
786792
array(1) {
787793
[0]=>
788-
string(1) "0"
794+
string(2) "0
795+
"
789796
}
790797
array(1) {
791798
[0]=>
792-
string(1) "1"
799+
string(2) "1
800+
"
793801
}
794802
array(1) {
795803
[0]=>
796-
string(2) "-1"
804+
string(3) "-1
805+
"
797806
}
798807
array(1) {
799808
[0]=>
800-
string(11) "-2147483648"
809+
string(12) "-2147483648
810+
"
801811
}
802812
array(1) {
803813
[0]=>
804-
string(11) "-2147483647"
814+
string(12) "-2147483647
815+
"
805816
}
806817
array(1) {
807818
[0]=>
808-
string(10) "2147483647"
819+
string(11) "2147483647
820+
"
809821
}
810822
array(1) {
811823
[0]=>
812-
string(10) "2147483640"
824+
string(11) "2147483640
825+
"
813826
}
814827
array(1) {
815828
[0]=>
816-
string(4) "4667"
829+
string(5) "4667
830+
"
817831
}
818832
array(1) {
819833
[0]=>
820-
string(4) "4779"
834+
string(5) "4779
835+
"
821836
}
822837
array(1) {
823838
[0]=>
824-
string(4) "4095"
839+
string(5) "4095
840+
"
825841
}
826842
array(1) {
827843
[0]=>
828-
string(3) "250"
844+
string(4) "250
845+
"
829846
}
830847
array(1) {
831848
[0]=>
832-
string(11) "-2147483648"
849+
string(12) "-2147483648
850+
"
833851
}
834852
array(1) {
835853
[0]=>
836-
string(10) "2147483647"
854+
string(11) "2147483647
855+
"
837856
}
838857
array(1) {
839858
[0]=>
840-
string(10) "2147483647"
859+
string(11) "2147483647
860+
"
841861
}
842862
array(1) {
843863
[0]=>
844-
string(2) "83"
864+
string(3) "83
865+
"
845866
}
846867
array(1) {
847868
[0]=>
848-
string(1) "1"
869+
string(2) "1
870+
"
849871
}
850872
array(1) {
851873
[0]=>
852-
string(11) "-2147483648"
874+
string(12) "-2147483648
875+
"
853876
}
854877
array(1) {
855878
[0]=>
856-
string(10) "2147483647"
879+
string(11) "2147483647
880+
"
857881
}
858882
bool(false)
859883

ext/standard/tests/file/fscanf_variation21.phpt

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -633,15 +633,17 @@ array(1) {
633633
}
634634
array(1) {
635635
[0]=>
636-
string(1) "0"
636+
string(2) "0
637+
"
637638
}
638639
array(1) {
639640
[0]=>
640641
string(4) "-0.1"
641642
}
642643
array(1) {
643644
[0]=>
644-
string(1) "1"
645+
string(2) "1
646+
"
645647
}
646648
array(1) {
647649
[0]=>
@@ -661,7 +663,8 @@ array(1) {
661663
}
662664
array(1) {
663665
[0]=>
664-
string(2) "10"
666+
string(3) "10
667+
"
665668
}
666669
array(1) {
667670
[0]=>
@@ -672,63 +675,78 @@ bool(false)
672675
-- iteration 11 --
673676
array(1) {
674677
[0]=>
675-
string(11) "-2147483649"
678+
string(12) "-2147483649
679+
"
676680
}
677681
array(1) {
678682
[0]=>
679-
string(10) "2147483648"
683+
string(11) "2147483648
684+
"
680685
}
681686
array(1) {
682687
[0]=>
683-
string(11) "-2147483649"
688+
string(12) "-2147483649
689+
"
684690
}
685691
array(1) {
686692
[0]=>
687-
string(11) "34359738369"
693+
string(12) "34359738369
694+
"
688695
}
689696
array(1) {
690697
[0]=>
691-
string(10) "2147483649"
698+
string(11) "2147483649
699+
"
692700
}
693701
array(1) {
694702
[0]=>
695-
string(11) "-2147483649"
703+
string(12) "-2147483649
704+
"
696705
}
697706
array(1) {
698707
[0]=>
699-
string(1) "0"
708+
string(2) "0
709+
"
700710
}
701711
array(1) {
702712
[0]=>
703-
string(4) "-0.1"
713+
string(5) "-0.1
714+
"
704715
}
705716
array(1) {
706717
[0]=>
707-
string(1) "1"
718+
string(2) "1
719+
"
708720
}
709721
array(1) {
710722
[0]=>
711-
string(6) "100000"
723+
string(7) "100000
724+
"
712725
}
713726
array(1) {
714727
[0]=>
715-
string(8) "-1000000"
728+
string(9) "-1000000
729+
"
716730
}
717731
array(1) {
718732
[0]=>
719-
string(9) "100000000"
733+
string(10) "100000000
734+
"
720735
}
721736
array(1) {
722737
[0]=>
723-
string(11) "-1000000000"
738+
string(12) "-1000000000
739+
"
724740
}
725741
array(1) {
726742
[0]=>
727-
string(2) "10"
743+
string(3) "10
744+
"
728745
}
729746
array(1) {
730747
[0]=>
731-
string(7) "1050000"
748+
string(8) "1050000
749+
"
732750
}
733751
bool(false)
734752

ext/standard/tests/file/fscanf_variation22.phpt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ $file_path = __DIR__;
7676
$filename = "$file_path/fscanf_variation22.tmp";
7777
unlink($filename);
7878
?>
79-
--EXPECT--
79+
--EXPECTF--
8080
*** Test fscanf(): different char format types with resource ***
8181

8282
-- iteration 1 --
@@ -186,11 +186,13 @@ bool(false)
186186
-- iteration 11 --
187187
array(1) {
188188
[0]=>
189-
string(8) "Resource"
189+
string(%d) "Resource id #%d
190+
"
190191
}
191192
array(1) {
192193
[0]=>
193-
string(8) "Resource"
194+
string(%d) "Resource id #%d
195+
"
194196
}
195197
bool(false)
196198

0 commit comments

Comments
 (0)