| From 1a2a5aff71e8edba436398492279de434abfe7a3 Mon Sep 17 00:00:00 2001 |
| From: Thomas Frauendorfer | Miray Software <tf@miray.de> |
| 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 <tf@miray.de> |
| Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> |
| Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com> |
| --- |
| 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 50bf3ee..22417f7 100644 |
| --- a/grub-core/kern/misc.c |
| +++ b/grub-core/kern/misc.c |
| @@ -33,7 +33,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; |
| }; |
| @@ -776,12 +777,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; |
| @@ -816,6 +819,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; |
| } |
| } |
| |
| -- |
| 2.14.2 |
| |