From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Thomas Frauendorfer | Miray Software Date: Mon, 15 Feb 2021 14:04:26 +0100 Subject: [PATCH] kern/misc: Add STRING type for internal printf() format handling Set printf() argument type for "%s" to new type STRING. This is in preparation for a follow up patch to compare a printf() format string against an expected printf() format string. For "%s" the corresponding printf() argument is dereferenced as pointer while all other argument types are defined as integer value. However, when validating a printf() format it is necessary to differentiate "%s" from "%p" and other integers. So, let's do that. Signed-off-by: Thomas Frauendorfer | Miray Software Reviewed-by: Daniel Kiper --- grub-core/kern/misc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index ebfcc95f0..07456faa2 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -37,7 +37,8 @@ union printf_arg enum { INT, LONG, LONGLONG, - UNSIGNED_INT = 3, UNSIGNED_LONG, UNSIGNED_LONGLONG + UNSIGNED_INT = 3, UNSIGNED_LONG, UNSIGNED_LONGLONG, + STRING } type; long long ll; }; @@ -857,12 +858,14 @@ parse_printf_arg_fmt (const char *fmt0, struct printf_args *args) args->ptr[curn].type = INT + longfmt; break; case 'p': - case 's': if (sizeof (void *) == sizeof (long long)) args->ptr[curn].type = UNSIGNED_LONGLONG; else args->ptr[curn].type = UNSIGNED_INT; break; + case 's': + args->ptr[curn].type = STRING; + break; case 'C': case 'c': args->ptr[curn].type = INT; @@ -897,6 +900,12 @@ parse_printf_args (const char *fmt0, struct printf_args *args, va_list args_in) case UNSIGNED_LONGLONG: args->ptr[n].ll = va_arg (args_in, long long); break; + case STRING: + if (sizeof (void *) == sizeof (long long)) + args->ptr[n].ll = va_arg (args_in, long long); + else + args->ptr[n].ll = va_arg (args_in, unsigned int); + break; } }