From 148f1007689829df61268005ab5e54acca3b1566 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Tue, 15 Oct 2013 15:12:15 +0200 Subject: [PATCH] * grub-core/kern/misc.c (grub_vsnprintf_real): Handle %% properly. * tests/printf_unit_test.c (printf_test): Add %% tests. Reported by: Paulo Flabiano Smorigo. --- ChangeLog | 6 ++++++ grub-core/kern/misc.c | 6 ++++++ tests/printf_unit_test.c | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4e7e4d982..628fb5434 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-10-15 Vladimir Serbinenko + + * grub-core/kern/misc.c (grub_vsnprintf_real): Handle %% properly. + * tests/printf_unit_test.c (printf_test): Add %% tests. + Reported by: Paulo Flabiano Smorigo. + 2013-10-15 Vladimir Serbinenko * grub-core/osdep/windows/hostdisk.c (fsync) [__MINGW32__]: Really diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index 94b88a386..027bfde92 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -910,6 +910,12 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a } } + if (c == '%') + { + write_char (c); + continue; + } + if (curn >= count_args) continue; diff --git a/tests/printf_unit_test.c b/tests/printf_unit_test.c index 3d2f8f15d..b88c88594 100644 --- a/tests/printf_unit_test.c +++ b/tests/printf_unit_test.c @@ -21,13 +21,26 @@ #include #include -#define MSG "printf test failed" +#define MSG "printf test failed: %s, %s", real, expected static void printf_test (void) { char real[512]; char expected[512]; + + grub_snprintf (real, sizeof (real), "%d%%", 10); + snprintf (expected, sizeof (expected), "%d%%", 10); + grub_test_assert (strcmp (real, expected) == 0, MSG); + + grub_snprintf (real, sizeof (real), "%d %%", 10); + snprintf (expected, sizeof (expected), "%d %%", 10); + grub_test_assert (strcmp (real, expected) == 0, MSG); + + grub_snprintf (real, sizeof (real), "%%"); + snprintf (expected, sizeof (expected), "%%"); + grub_test_assert (strcmp (real, expected) == 0, MSG); + grub_snprintf (real, sizeof (real), "%d %d %d", 1, 2, 3); snprintf (expected, sizeof (expected), "%d %d %d", 1, 2, 3); grub_test_assert (strcmp (real, expected) == 0, MSG);