efi/printf: Merge 'p' with the integer formats
authorArvind Sankar <nivedita@alum.mit.edu>
Mon, 18 May 2020 19:07:02 +0000 (15:07 -0400)
committerArd Biesheuvel <ardb@kernel.org>
Tue, 19 May 2020 08:31:25 +0000 (10:31 +0200)
Treat 'p' as a hexadecimal integer with precision equal to the number of
digits in void *.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200518190716.751506-11-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
drivers/firmware/efi/libstub/vsprintf.c

index 00123d5..b7316ab 100644 (file)
@@ -297,9 +297,6 @@ int vsprintf(char *buf, const char *fmt, va_list args)
                        }
                }
 
-               /* default base */
-               base = 10;
-
                switch (*fmt) {
                case 'c':
                        if (!(flags & LEFT))
@@ -323,21 +320,15 @@ int vsprintf(char *buf, const char *fmt, va_list args)
                                *str++ = ' ';
                        continue;
 
-               case 'p':
-                       if (field_width == -1) {
-                               field_width = 2 * sizeof(void *);
-                               flags |= ZEROPAD;
-                       }
-                       str = number(str,
-                                    (unsigned long)va_arg(args, void *), 16,
-                                    field_width, precision, flags);
-                       continue;
-
                        /* integer number formats - set up the flags and "break" */
                case 'o':
                        base = 8;
                        break;
 
+               case 'p':
+                       if (precision < 0)
+                               precision = 2 * sizeof(void *);
+                       fallthrough;
                case 'x':
                        flags |= SMALL;
                        fallthrough;
@@ -350,6 +341,7 @@ int vsprintf(char *buf, const char *fmt, va_list args)
                        flags |= SIGN;
                        fallthrough;
                case 'u':
+                       base = 10;
                        break;
 
                default:
@@ -360,7 +352,9 @@ int vsprintf(char *buf, const char *fmt, va_list args)
                                --fmt;
                        continue;
                }
-               if (flags & SIGN) {
+               if (*fmt == 'p') {
+                       num = (unsigned long)va_arg(args, void *);
+               } else if (flags & SIGN) {
                        switch (qualifier) {
                        case 'L':
                                num = va_arg(args, long long);