Skip to content

Commit 427cc4f

Browse files
committed
Diagnose missing format specifier at end of string
1 parent 572b799 commit 427cc4f

10 files changed

+35
-28
lines changed

ext/standard/formatted_print.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,10 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
616616

617617
case '\0':
618618
if (!format_len) {
619-
goto exit;
619+
zend_value_error("Missing format specifier at end of string");
620+
goto fail;
620621
}
621-
break;
622+
/* break missing intentionally */
622623

623624
default:
624625
zend_value_error("Unknown format specifier '%c'", *format);
@@ -638,7 +639,6 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
638639
goto fail;
639640
}
640641

641-
exit:
642642
/* possibly, we have to make sure we have room for the terminating null? */
643643
ZSTR_VAL(result)[outpos]=0;
644644
ZSTR_LEN(result) = outpos;

ext/standard/tests/strings/sprintf_error.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ try {
6666
echo $e->getMessage(), "\n";
6767
}
6868

69+
try {
70+
var_dump(sprintf("foo %", 42));
71+
} catch (ValueError $e) {
72+
echo $e->getMessage(), "\n";
73+
}
74+
6975
echo "Done";
7076
?>
7177
--EXPECTF--
@@ -82,4 +88,5 @@ sprintf() expects at least %d parameter, %d given
8288
4 parameters are required, 2 given
8389
4 parameters are required, 1 given
8490
101 parameters are required, 1 given
91+
Missing format specifier at end of string
8592
Done

ext/standard/tests/strings/vprintf_variation11.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ $formats = array(
2626
"%10.4o %-10.4o %04o %04.4o",
2727
"%'#2o %'2o %'$2o %'_2o",
2828
"%o %o %o %o",
29-
"%% %%o %10",
29+
"%% %%o",
3030
'%3$o %4$o %1$o %2$o'
3131
);
3232

@@ -39,7 +39,7 @@ $args_array = array(
3939
array(0123456, 01234567, -01234567, 01234567),
4040
array(0111, 02222, -0333333, -044444444),
4141
array(0x123b, 0xfAb, 0123, 012),
42-
array(01234, 0567, -01234),
42+
array(01234, 0567),
4343
array(03, 04, 01, 02)
4444

4545
);
@@ -84,8 +84,8 @@ int(32)
8484
int(17)
8585

8686
-- Iteration 7 --
87-
% %o
88-
int(5)
87+
% %o
88+
int(4)
8989

9090
-- Iteration 8 --
9191
1 2 3 4

ext/standard/tests/strings/vprintf_variation11_64bit.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ $formats = array(
2626
"%10.4o %-10.4o %04o %04.4o",
2727
"%'#2o %'2o %'$2o %'_2o",
2828
"%o %o %o %o",
29-
"%% %%o %10",
29+
"%% %%o",
3030
'%3$o %4$o %1$o %2$o'
3131
);
3232

@@ -39,7 +39,7 @@ $args_array = array(
3939
array(0123456, 01234567, -01234567, 01234567),
4040
array(0111, 02222, -0333333, -044444444),
4141
array(0x123b, 0xfAb, 0123, 012),
42-
array(01234, 0567, -01234),
42+
array(01234, 0567),
4343
array(03, 04, 01, 02)
4444

4545
);
@@ -84,8 +84,8 @@ int(54)
8484
int(17)
8585

8686
-- Iteration 7 --
87-
% %o
88-
int(5)
87+
% %o
88+
int(4)
8989

9090
-- Iteration 8 --
9191
1 2 3 4

ext/standard/tests/strings/vprintf_variation13.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ $formats = array(
2626
"%10.4x %-10.4x %04x %04.4x",
2727
"%'#2x %'2x %'$2x %'_2x",
2828
"%x %x %x %x",
29-
"% %%x x%",
29+
"% %%x",
3030
'%3$x %4$x %1$x %2$x'
3131
);
3232

@@ -56,7 +56,7 @@ foreach($formats as $format) {
5656
}
5757

5858
?>
59-
--EXPECTF--
59+
--EXPECT--
6060
*** Testing vprintf() : hexa formats with hexa values ***
6161

6262
-- Iteration 1 --
@@ -84,8 +84,8 @@ int(22)
8484
int(12)
8585

8686
-- Iteration 7 --
87-
%34 x
88-
int(5)
87+
%34
88+
int(3)
8989

9090
-- Iteration 8 --
9191
1 2 3 4

ext/standard/tests/strings/vprintf_variation13_64bit.phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ $formats = array(
2626
"%10.4x %-10.4x %04x %04.4x",
2727
"%'#2x %'2x %'$2x %'_2x",
2828
"%x %x %x %x",
29-
"% %%x x%",
29+
"% %%x",
3030
'%3$x %4$x %1$x %2$x'
3131
);
3232

@@ -39,7 +39,7 @@ $args_array = array(
3939
array(123456, 12345678, -1234567, 1234567),
4040
array(1, 0x2222, 0333333, -0x44444444),
4141
array(0x123b, 0xfAb, "0xaxz", 012),
42-
array(0x1234, 0x34, 0x2ff),
42+
array(0x1234, 0x34),
4343
array(0x3, 0x4, 0x1, 0x2)
4444

4545
);
@@ -56,7 +56,7 @@ foreach($formats as $format) {
5656
}
5757

5858
?>
59-
--EXPECTF--
59+
--EXPECT--
6060
*** Testing vprintf() : hexa formats with hexa values ***
6161

6262
-- Iteration 1 --
@@ -84,8 +84,8 @@ int(30)
8484
int(12)
8585

8686
-- Iteration 7 --
87-
%34 x
88-
int(5)
87+
%34
88+
int(3)
8989

9090
-- Iteration 8 --
9191
1 2 3 4

ext/standard/tests/strings/vprintf_variation3.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $formats = array(
2323
"%10.4d %-10.4d %04d %04.4d",
2424
"%'#2d %'2d %'$2d %'_2d",
2525
"%d %d %d %d",
26-
"% %%d d%",
26+
"% %%d",
2727
'%3$d %4$d %1$d %2$d'
2828
);
2929

@@ -36,7 +36,7 @@ $args_array = array(
3636
array(123456, 12345678, -1234567, 1234567),
3737
array(111, 2222, 333333, 44444444),
3838
array(0x123b, 0xfAb, 0123, 012),
39-
array(1234, -5678, 2345),
39+
array(1234, -5678),
4040
array(3, 4, 1, 2)
4141

4242
);
@@ -81,8 +81,8 @@ int(24)
8181
int(15)
8282

8383
-- Iteration 7 --
84-
%-5678 d
85-
int(8)
84+
%-5678
85+
int(6)
8686

8787
-- Iteration 8 --
8888
1 2 3 4

ext/standard/tests/strings/vprintf_variation5.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $formats = array(
2323
"%10.4f %-10.4F %04f %04.4f",
2424
"%'#2f %'2f %'$2f %'_2f",
2525
"%f %f %f %f",
26-
"% %%f f%",
26+
"% %%f",
2727
'%3$f %4$f %1$f %2$f'
2828
);
2929

@@ -36,7 +36,7 @@ $args_array = array(
3636
array(2e5, 2e-5, -2e5, -2e-5),
3737
array(0.2E5, -0.2e40, 0.2E-20, 0.2E+20),
3838
array(0x123b, 0xfAb, 0123, 012),
39-
array(1234.1234, -5678.5678, 2345.2345),
39+
array(1234.1234, -5678.5678),
4040
array(3.33, 4.44, 1.11, 2.22)
4141

4242
);
@@ -81,8 +81,8 @@ int(98)
8181
int(43)
8282

8383
-- Iteration 7 --
84-
%-5678.567800 f
85-
int(15)
84+
%-5678.567800
85+
int(13)
8686

8787
-- Iteration 8 --
8888
1.110000 2.220000 3.330000 4.440000
-13 Bytes
Binary file not shown.
-11 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)