]> granicus.if.org Git - php/commitdiff
Diagnose missing format specifier at end of string
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 22 Apr 2020 10:53:34 +0000 (12:53 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 22 Apr 2020 11:05:16 +0000 (13:05 +0200)
ext/standard/formatted_print.c
ext/standard/tests/strings/sprintf_error.phpt
ext/standard/tests/strings/vprintf_variation11.phpt
ext/standard/tests/strings/vprintf_variation11_64bit.phpt
ext/standard/tests/strings/vprintf_variation13.phpt
ext/standard/tests/strings/vprintf_variation13_64bit.phpt
ext/standard/tests/strings/vprintf_variation3.phpt
ext/standard/tests/strings/vprintf_variation5.phpt
ext/standard/tests/strings/vprintf_variation7.phpt
ext/standard/tests/strings/vprintf_variation9.phpt

index 5c67776f5b2140c0d791f956c498773e76d364bf..3448b86bc208aecbb6363c3dff2bd8202c0c1f7d 100644 (file)
@@ -616,9 +616,10 @@ php_formatted_print(char *format, size_t format_len, zval *args, int argc, int n
 
                                case '\0':
                                        if (!format_len) {
-                                               goto exit;
+                                               zend_value_error("Missing format specifier at end of string");
+                                               goto fail;
                                        }
-                                       break;
+                                       /* break missing intentionally */
 
                                default:
                                        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
                goto fail;
        }
 
-exit:
        /* possibly, we have to make sure we have room for the terminating null? */
        ZSTR_VAL(result)[outpos]=0;
        ZSTR_LEN(result) = outpos;
index bc34b1d0f3dc63efafa1edf3f72649a11560139b..a65bf318d3931f8ff552ce4d34aff23620df246f 100644 (file)
@@ -66,6 +66,12 @@ try {
     echo $e->getMessage(), "\n";
 }
 
+try {
+    var_dump(sprintf("foo %", 42));
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
 echo "Done";
 ?>
 --EXPECTF--
@@ -82,4 +88,5 @@ sprintf() expects at least %d parameter, %d given
 4 parameters are required, 2 given
 4 parameters are required, 1 given
 101 parameters are required, 1 given
+Missing format specifier at end of string
 Done
index b05d8ac6819874effc8f5b98911ba2ebf2de4fa0..5022b3d5c6f526cbe85cab2dc9721c25cb8b4988 100644 (file)
@@ -26,7 +26,7 @@ $formats = array(
   "%10.4o %-10.4o %04o %04.4o",
   "%'#2o %'2o %'$2o %'_2o",
   "%o %o %o %o",
-  "%% %%o %10",
+  "%% %%o",
   '%3$o %4$o %1$o %2$o'
 );
 
@@ -39,7 +39,7 @@ $args_array = array(
   array(0123456, 01234567, -01234567, 01234567),
   array(0111, 02222, -0333333, -044444444),
   array(0x123b, 0xfAb, 0123, 012),
-  array(01234, 0567, -01234),
+  array(01234, 0567),
   array(03, 04, 01, 02)
 
 );
@@ -84,8 +84,8 @@ int(32)
 int(17)
 
 -- Iteration 7 --
-% %o 
-int(5)
+% %o
+int(4)
 
 -- Iteration 8 --
 1 2 3 4
index 46800e820a886c1e2b922abc008e11a19b730f62..e183dcd838e3b8db5539399c3d74b20c2aaabf2f 100644 (file)
@@ -26,7 +26,7 @@ $formats = array(
   "%10.4o %-10.4o %04o %04.4o",
   "%'#2o %'2o %'$2o %'_2o",
   "%o %o %o %o",
-  "%% %%o %10",
+  "%% %%o",
   '%3$o %4$o %1$o %2$o'
 );
 
@@ -39,7 +39,7 @@ $args_array = array(
   array(0123456, 01234567, -01234567, 01234567),
   array(0111, 02222, -0333333, -044444444),
   array(0x123b, 0xfAb, 0123, 012),
-  array(01234, 0567, -01234),
+  array(01234, 0567),
   array(03, 04, 01, 02)
 
 );
@@ -84,8 +84,8 @@ int(54)
 int(17)
 
 -- Iteration 7 --
-% %o 
-int(5)
+% %o
+int(4)
 
 -- Iteration 8 --
 1 2 3 4
index 25968538c8e6f08685347c723db33f37299d7e6d..39c696368985701ab8bff8134ac8dbb0d9ee6f23 100644 (file)
@@ -26,7 +26,7 @@ $formats = array(
   "%10.4x %-10.4x %04x %04.4x",
   "%'#2x %'2x %'$2x %'_2x",
   "%x %x %x %x",
-  "% %%x x%",
+  "% %%x",
   '%3$x %4$x %1$x %2$x'
 );
 
@@ -56,7 +56,7 @@ foreach($formats as $format) {
 }
 
 ?>
---EXPECTF--
+--EXPECT--
 *** Testing vprintf() : hexa formats with hexa values ***
 
 -- Iteration 1 --
@@ -84,8 +84,8 @@ int(22)
 int(12)
 
 -- Iteration 7 --
-%34 x
-int(5)
+%34
+int(3)
 
 -- Iteration 8 --
 1 2 3 4
index 261d10fe4e285fe3202d90c9b1fcebe9b3433e41..c9af50fc948e493208d1cd14b6b4720fc511919f 100644 (file)
@@ -26,7 +26,7 @@ $formats = array(
   "%10.4x %-10.4x %04x %04.4x",
   "%'#2x %'2x %'$2x %'_2x",
   "%x %x %x %x",
-  "% %%x x%",
+  "% %%x",
   '%3$x %4$x %1$x %2$x'
 );
 
@@ -39,7 +39,7 @@ $args_array = array(
   array(123456, 12345678, -1234567, 1234567),
   array(1, 0x2222, 0333333, -0x44444444),
   array(0x123b, 0xfAb, "0xaxz", 012),
-  array(0x1234, 0x34, 0x2ff),
+  array(0x1234, 0x34),
   array(0x3, 0x4, 0x1, 0x2)
 
 );
@@ -56,7 +56,7 @@ foreach($formats as $format) {
 }
 
 ?>
---EXPECTF--
+--EXPECT--
 *** Testing vprintf() : hexa formats with hexa values ***
 
 -- Iteration 1 --
@@ -84,8 +84,8 @@ int(30)
 int(12)
 
 -- Iteration 7 --
-%34 x
-int(5)
+%34
+int(3)
 
 -- Iteration 8 --
 1 2 3 4
index c665eb024d6ca15cc94028c5f95a703f7ae65387..e3350e70d709acab8f459ab66ff449759b0e8bcb 100644 (file)
@@ -23,7 +23,7 @@ $formats = array(
   "%10.4d %-10.4d %04d %04.4d",
   "%'#2d %'2d %'$2d %'_2d",
   "%d %d %d %d",
-  "% %%d d%",
+  "% %%d",
   '%3$d %4$d %1$d %2$d'
 );
 
@@ -36,7 +36,7 @@ $args_array = array(
   array(123456, 12345678, -1234567, 1234567),
   array(111, 2222, 333333, 44444444),
   array(0x123b, 0xfAb, 0123, 012),
-  array(1234, -5678, 2345),
+  array(1234, -5678),
   array(3, 4, 1, 2)
 
 );
@@ -81,8 +81,8 @@ int(24)
 int(15)
 
 -- Iteration 7 --
-%-5678 d
-int(8)
+%-5678
+int(6)
 
 -- Iteration 8 --
 1 2 3 4
index 52d2424353bd55dd148679ad22525c3c616a5d37..bdc41718f01e4f37d801bbaadd9ecb1c7df3fbfc 100644 (file)
@@ -23,7 +23,7 @@ $formats = array(
   "%10.4f %-10.4F %04f %04.4f",
   "%'#2f %'2f %'$2f %'_2f",
   "%f %f %f %f",
-  "% %%f f%",
+  "% %%f",
   '%3$f %4$f %1$f %2$f'
 );
 
@@ -36,7 +36,7 @@ $args_array = array(
   array(2e5, 2e-5, -2e5, -2e-5),
   array(0.2E5, -0.2e40, 0.2E-20, 0.2E+20),
   array(0x123b, 0xfAb, 0123, 012),
-  array(1234.1234, -5678.5678, 2345.2345),
+  array(1234.1234, -5678.5678),
   array(3.33, 4.44, 1.11, 2.22)
 
 );
@@ -81,8 +81,8 @@ int(98)
 int(43)
 
 -- Iteration 7 --
-%-5678.567800 f
-int(15)
+%-5678.567800
+int(13)
 
 -- Iteration 8 --
 1.110000 2.220000 3.330000 4.440000
index e2af17feb99d978dd552aedede46ac34e7918b52..6e66d9b182078bf8161b15c98063718675a1cd22 100644 (file)
Binary files a/ext/standard/tests/strings/vprintf_variation7.phpt and b/ext/standard/tests/strings/vprintf_variation7.phpt differ
index 83b6f21a4dc067de8181116e34b036b6b5340cd5..adc35c6b54562d81726dd3c512c091c9a68fea7c 100644 (file)
Binary files a/ext/standard/tests/strings/vprintf_variation9.phpt and b/ext/standard/tests/strings/vprintf_variation9.phpt differ