65 lines
2.1 KiB
Diff
65 lines
2.1 KiB
Diff
From 0000000000000000000000000000000000000000 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>
|
|
---
|
|
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;
|
|
}
|
|
}
|
|
|