diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index 906d2c2f7..e3f851633 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -740,6 +740,12 @@ parse_printf_args (const char *fmt0, struct printf_args *args, fmt++; c = *fmt++; + if (c == '%') + { + n--; + continue; + } + if (c == 'l') { c = *fmt++; @@ -876,6 +882,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, if (c == '%') { write_char (str, &count, max_len,c); + n--; continue; } diff --git a/tests/printf_unit_test.c b/tests/printf_unit_test.c index eb76bd002..d7b12c6db 100644 --- a/tests/printf_unit_test.c +++ b/tests/printf_unit_test.c @@ -66,6 +66,9 @@ printf_test (void) grub_snprintf (real, sizeof (real), "%3$d %2$lld %1$d", 1, 2LL, 3); snprintf (expected, sizeof (expected), "%3$d %2$lld %1$d", 1, 2LL, 3); grub_test_assert (strcmp (real, expected) == 0, MSG); + grub_snprintf (real, sizeof (real), "%%0%dd ", 1); + snprintf (expected, sizeof (expected), "%%0%dd ", 1); + grub_test_assert (strcmp (real, expected) == 0, MSG); } GRUB_UNIT_TEST ("printf_unit_test", printf_test);