1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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
|