From: Arvind Sankar <nivedita@alum.mit.edu>
Date: Mon, 18 May 2020 15:07:04 -0400
Subject: efi/printf: Factor out integer argument retrieval
Patch-mainline: v5.8-rc1
Git-commit: dec6119952eab7257624de5bd116a9e301ead5b7
References: jsc#SLE-16407
Factor out the code to get the correct type of numeric argument into a
helper function.
Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200518190716.751506-13-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Acked-by: Lee, Chun-Yi <jlee@suse.com>
---
drivers/firmware/efi/libstub/vsprintf.c | 66 ++++++++++++++++----------------
1 file changed, 33 insertions(+), 33 deletions(-)
--- a/drivers/firmware/efi/libstub/vsprintf.c
+++ b/drivers/firmware/efi/libstub/vsprintf.c
@@ -244,6 +244,38 @@ int get_int(const char **fmt, va_list *a
return 0;
}
+static
+unsigned long long get_number(int sign, int qualifier, va_list *ap)
+{
+ if (sign) {
+ switch (qualifier) {
+ case 'L':
+ return va_arg(*ap, long long);
+ case 'l':
+ return va_arg(*ap, long);
+ case 'h':
+ return (short)va_arg(*ap, int);
+ case 'H':
+ return (signed char)va_arg(*ap, int);
+ default:
+ return va_arg(*ap, int);
+ };
+ } else {
+ switch (qualifier) {
+ case 'L':
+ return va_arg(*ap, unsigned long long);
+ case 'l':
+ return va_arg(*ap, unsigned long);
+ case 'h':
+ return (unsigned short)va_arg(*ap, int);
+ case 'H':
+ return (unsigned char)va_arg(*ap, int);
+ default:
+ return va_arg(*ap, unsigned int);
+ }
+ }
+}
+
int vsprintf(char *buf, const char *fmt, va_list ap)
{
int len;
@@ -370,40 +402,8 @@ int vsprintf(char *buf, const char *fmt,
}
if (*fmt == 'p') {
num = (unsigned long)va_arg(args, void *);
- } else if (flags & SIGN) {
- switch (qualifier) {
- case 'L':
- num = va_arg(args, long long);
- break;
- case 'l':
- num = va_arg(args, long);
- break;
- case 'h':
- num = (short)va_arg(args, int);
- break;
- case 'H':
- num = (signed char)va_arg(args, int);
- break;
- default:
- num = va_arg(args, int);
- }
} else {
- switch (qualifier) {
- case 'L':
- num = va_arg(args, unsigned long long);
- break;
- case 'l':
- num = va_arg(args, unsigned long);
- break;
- case 'h':
- num = (unsigned short)va_arg(args, int);
- break;
- case 'H':
- num = (unsigned char)va_arg(args, int);
- break;
- default:
- num = va_arg(args, unsigned int);
- }
+ num = get_number(flags & SIGN, qualifier, &args);
}
str = number(str, num, base, field_width, precision, flags);
}