diff --git a/ChangeLog b/ChangeLog index d9a362b6b..7ce7c3a0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,18 @@ -2013-10-21 Vladimir Serbinenko +2013-10-27 Vladimir Serbinenko + + * grub-core/kern/misc.c (grub_vsnprintf_real): Unify int and wchar + handling. + +2013-10-27 Vladimir Serbinenko * grub-core/kern/misc.c (grub_abort): Make static -2013-10-21 Vladimir Serbinenko +2013-10-27 Vladimir Serbinenko * grub-core/kern/misc.c (grub_vsnprintf_real): Don't attempt to transform invalid unicode codepoints. -2013-10-21 Vladimir Serbinenko +2013-10-27 Vladimir Serbinenko * grub-core/kern/misc.c (grub_vsnprintf_real): Remove needless explicit \0 checking. diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index bff44ff08..d8de0bb09 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -705,16 +705,17 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a } } - enum { INT, WCHAR, LONG, LONGLONG, POINTER } types[count_args]; + enum { INT, LONG, LONGLONG, POINTER } types[count_args]; union { int i; - grub_uint32_t w; long l; long long ll; void *p; } args[count_args]; + COMPILE_TIME_ASSERT (sizeof (int) == sizeof (grub_uint32_t)); + grub_memset (types, 0, sizeof (types)); fmt = fmt0; @@ -786,21 +787,16 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a case 's': types[curn] = POINTER; break; + case 'C': case 'c': types[curn] = INT; break; - case 'C': - types[curn] = WCHAR; - break; } } for (n = 0; n < count_args; n++) switch (types[n]) { - case WCHAR: - args[n].w = va_arg (args_in, grub_uint32_t); - break; case POINTER: args[n].p = va_arg (args_in, void *); break; @@ -928,7 +924,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list a case 'C': { - grub_uint32_t code = args[curn].w; + grub_uint32_t code = args[curn].i; int shift; unsigned mask;