Blame SOURCES/0421-kern-misc-Add-STRING-type-for-internal-printf-format.patch

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