LCOV - code coverage report
Current view: top level - lib - vsprintf.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 611 1569 38.9 %
Date: 2021-04-22 12:43:58 Functions: 35 74 47.3 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  *  linux/lib/vsprintf.c
       4             :  *
       5             :  *  Copyright (C) 1991, 1992  Linus Torvalds
       6             :  */
       7             : 
       8             : /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
       9             : /*
      10             :  * Wirzenius wrote this portably, Torvalds fucked it up :-)
      11             :  */
      12             : 
      13             : /*
      14             :  * Fri Jul 13 2001 Crutcher Dunnavant <crutcher+kernel@datastacks.com>
      15             :  * - changed to provide snprintf and vsnprintf functions
      16             :  * So Feb  1 16:51:32 CET 2004 Juergen Quade <quade@hsnr.de>
      17             :  * - scnprintf and vscnprintf
      18             :  */
      19             : 
      20             : #include <stdarg.h>
      21             : #include <linux/build_bug.h>
      22             : #include <linux/clk.h>
      23             : #include <linux/clk-provider.h>
      24             : #include <linux/errname.h>
      25             : #include <linux/module.h> /* for KSYM_SYMBOL_LEN */
      26             : #include <linux/types.h>
      27             : #include <linux/string.h>
      28             : #include <linux/ctype.h>
      29             : #include <linux/kernel.h>
      30             : #include <linux/kallsyms.h>
      31             : #include <linux/math64.h>
      32             : #include <linux/uaccess.h>
      33             : #include <linux/ioport.h>
      34             : #include <linux/dcache.h>
      35             : #include <linux/cred.h>
      36             : #include <linux/rtc.h>
      37             : #include <linux/time.h>
      38             : #include <linux/uuid.h>
      39             : #include <linux/of.h>
      40             : #include <net/addrconf.h>
      41             : #include <linux/siphash.h>
      42             : #include <linux/compiler.h>
      43             : #include <linux/property.h>
      44             : #ifdef CONFIG_BLOCK
      45             : #include <linux/blkdev.h>
      46             : #endif
      47             : 
      48             : #include "../mm/internal.h"   /* For the trace_print_flags arrays */
      49             : 
      50             : #include <asm/page.h>             /* for PAGE_SIZE */
      51             : #include <asm/byteorder.h>        /* cpu_to_le16 */
      52             : 
      53             : #include <linux/string_helpers.h>
      54             : #include "kstrtox.h"
      55             : 
      56             : /**
      57             :  * simple_strtoull - convert a string to an unsigned long long
      58             :  * @cp: The start of the string
      59             :  * @endp: A pointer to the end of the parsed string will be placed here
      60             :  * @base: The number base to use
      61             :  *
      62             :  * This function has caveats. Please use kstrtoull instead.
      63             :  */
      64         169 : unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
      65             : {
      66         169 :         unsigned long long result;
      67         169 :         unsigned int rv;
      68             : 
      69         169 :         cp = _parse_integer_fixup_radix(cp, &base);
      70         169 :         rv = _parse_integer(cp, base, &result);
      71             :         /* FIXME */
      72         169 :         cp += (rv & ~KSTRTOX_OVERFLOW);
      73             : 
      74         169 :         if (endp)
      75         118 :                 *endp = (char *)cp;
      76             : 
      77         169 :         return result;
      78             : }
      79             : EXPORT_SYMBOL(simple_strtoull);
      80             : 
      81             : /**
      82             :  * simple_strtoul - convert a string to an unsigned long
      83             :  * @cp: The start of the string
      84             :  * @endp: A pointer to the end of the parsed string will be placed here
      85             :  * @base: The number base to use
      86             :  *
      87             :  * This function has caveats. Please use kstrtoul instead.
      88             :  */
      89          69 : unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
      90             : {
      91          64 :         return simple_strtoull(cp, endp, base);
      92             : }
      93             : EXPORT_SYMBOL(simple_strtoul);
      94             : 
      95             : /**
      96             :  * simple_strtol - convert a string to a signed long
      97             :  * @cp: The start of the string
      98             :  * @endp: A pointer to the end of the parsed string will be placed here
      99             :  * @base: The number base to use
     100             :  *
     101             :  * This function has caveats. Please use kstrtol instead.
     102             :  */
     103           3 : long simple_strtol(const char *cp, char **endp, unsigned int base)
     104             : {
     105           3 :         if (*cp == '-')
     106           0 :                 return -simple_strtoul(cp + 1, endp, base);
     107             : 
     108           3 :         return simple_strtoul(cp, endp, base);
     109             : }
     110             : EXPORT_SYMBOL(simple_strtol);
     111             : 
     112             : /**
     113             :  * simple_strtoll - convert a string to a signed long long
     114             :  * @cp: The start of the string
     115             :  * @endp: A pointer to the end of the parsed string will be placed here
     116             :  * @base: The number base to use
     117             :  *
     118             :  * This function has caveats. Please use kstrtoll instead.
     119             :  */
     120           2 : long long simple_strtoll(const char *cp, char **endp, unsigned int base)
     121             : {
     122           2 :         if (*cp == '-')
     123           0 :                 return -simple_strtoull(cp + 1, endp, base);
     124             : 
     125           2 :         return simple_strtoull(cp, endp, base);
     126             : }
     127             : EXPORT_SYMBOL(simple_strtoll);
     128             : 
     129             : static noinline_for_stack
     130        4047 : int skip_atoi(const char **s)
     131             : {
     132        4047 :         int i = 0;
     133             : 
     134        4521 :         do {
     135        4521 :                 i = i*10 + *((*s)++) - '0';
     136        4521 :         } while (isdigit(**s));
     137             : 
     138        4047 :         return i;
     139             : }
     140             : 
     141             : /*
     142             :  * Decimal conversion is by far the most typical, and is used for
     143             :  * /proc and /sys data. This directly impacts e.g. top performance
     144             :  * with many processes running. We optimize it for speed by emitting
     145             :  * two characters at a time, using a 200 byte lookup table. This
     146             :  * roughly halves the number of multiplications compared to computing
     147             :  * the digits one at a time. Implementation strongly inspired by the
     148             :  * previous version, which in turn used ideas described at
     149             :  * <http://www.cs.uiowa.edu/~jones/bcd/divide.html> (with permission
     150             :  * from the author, Douglas W. Jones).
     151             :  *
     152             :  * It turns out there is precisely one 26 bit fixed-point
     153             :  * approximation a of 64/100 for which x/100 == (x * (u64)a) >> 32
     154             :  * holds for all x in [0, 10^8-1], namely a = 0x28f5c29. The actual
     155             :  * range happens to be somewhat larger (x <= 1073741898), but that's
     156             :  * irrelevant for our purpose.
     157             :  *
     158             :  * For dividing a number in the range [10^4, 10^6-1] by 100, we still
     159             :  * need a 32x32->64 bit multiply, so we simply use the same constant.
     160             :  *
     161             :  * For dividing a number in the range [100, 10^4-1] by 100, there are
     162             :  * several options. The simplest is (x * 0x147b) >> 19, which is valid
     163             :  * for all x <= 43698.
     164             :  */
     165             : 
     166             : static const u16 decpair[100] = {
     167             : #define _(x) (__force u16) cpu_to_le16(((x % 10) | ((x / 10) << 8)) + 0x3030)
     168             :         _( 0), _( 1), _( 2), _( 3), _( 4), _( 5), _( 6), _( 7), _( 8), _( 9),
     169             :         _(10), _(11), _(12), _(13), _(14), _(15), _(16), _(17), _(18), _(19),
     170             :         _(20), _(21), _(22), _(23), _(24), _(25), _(26), _(27), _(28), _(29),
     171             :         _(30), _(31), _(32), _(33), _(34), _(35), _(36), _(37), _(38), _(39),
     172             :         _(40), _(41), _(42), _(43), _(44), _(45), _(46), _(47), _(48), _(49),
     173             :         _(50), _(51), _(52), _(53), _(54), _(55), _(56), _(57), _(58), _(59),
     174             :         _(60), _(61), _(62), _(63), _(64), _(65), _(66), _(67), _(68), _(69),
     175             :         _(70), _(71), _(72), _(73), _(74), _(75), _(76), _(77), _(78), _(79),
     176             :         _(80), _(81), _(82), _(83), _(84), _(85), _(86), _(87), _(88), _(89),
     177             :         _(90), _(91), _(92), _(93), _(94), _(95), _(96), _(97), _(98), _(99),
     178             : #undef _
     179             : };
     180             : 
     181             : /*
     182             :  * This will print a single '0' even if r == 0, since we would
     183             :  * immediately jump to out_r where two 0s would be written but only
     184             :  * one of them accounted for in buf. This is needed by ip4_string
     185             :  * below. All other callers pass a non-zero value of r.
     186             : */
     187             : static noinline_for_stack
     188       24814 : char *put_dec_trunc8(char *buf, unsigned r)
     189             : {
     190       24814 :         unsigned q;
     191             : 
     192             :         /* 1 <= r < 10^8 */
     193       24814 :         if (r < 100)
     194       17127 :                 goto out_r;
     195             : 
     196             :         /* 100 <= r < 10^8 */
     197        7687 :         q = (r * (u64)0x28f5c29) >> 32;
     198        7687 :         *((u16 *)buf) = decpair[r - 100*q];
     199        7687 :         buf += 2;
     200             : 
     201             :         /* 1 <= q < 10^6 */
     202        7687 :         if (q < 100)
     203        5446 :                 goto out_q;
     204             : 
     205             :         /*  100 <= q < 10^6 */
     206        2241 :         r = (q * (u64)0x28f5c29) >> 32;
     207        2241 :         *((u16 *)buf) = decpair[q - 100*r];
     208        2241 :         buf += 2;
     209             : 
     210             :         /* 1 <= r < 10^4 */
     211        2241 :         if (r < 100)
     212        1411 :                 goto out_r;
     213             : 
     214             :         /* 100 <= r < 10^4 */
     215         830 :         q = (r * 0x147b) >> 19;
     216         830 :         *((u16 *)buf) = decpair[r - 100*q];
     217         830 :         buf += 2;
     218             : out_q:
     219             :         /* 1 <= q < 100 */
     220             :         r = q;
     221       24814 : out_r:
     222             :         /* 1 <= r < 100 */
     223       24814 :         *((u16 *)buf) = decpair[r];
     224       24814 :         buf += r < 10 ? 1 : 2;
     225       24814 :         return buf;
     226             : }
     227             : 
     228             : #if BITS_PER_LONG == 64 && BITS_PER_LONG_LONG == 64
     229             : static noinline_for_stack
     230        1320 : char *put_dec_full8(char *buf, unsigned r)
     231             : {
     232        1320 :         unsigned q;
     233             : 
     234             :         /* 0 <= r < 10^8 */
     235        1320 :         q = (r * (u64)0x28f5c29) >> 32;
     236        1320 :         *((u16 *)buf) = decpair[r - 100*q];
     237        1320 :         buf += 2;
     238             : 
     239             :         /* 0 <= q < 10^6 */
     240        1320 :         r = (q * (u64)0x28f5c29) >> 32;
     241        1320 :         *((u16 *)buf) = decpair[q - 100*r];
     242        1320 :         buf += 2;
     243             : 
     244             :         /* 0 <= r < 10^4 */
     245        1320 :         q = (r * 0x147b) >> 19;
     246        1320 :         *((u16 *)buf) = decpair[r - 100*q];
     247        1320 :         buf += 2;
     248             : 
     249             :         /* 0 <= q < 100 */
     250        1320 :         *((u16 *)buf) = decpair[q];
     251        1320 :         buf += 2;
     252        1320 :         return buf;
     253             : }
     254             : 
     255             : static noinline_for_stack
     256       24813 : char *put_dec(char *buf, unsigned long long n)
     257             : {
     258       24813 :         if (n >= 100*1000*1000)
     259        1172 :                 buf = put_dec_full8(buf, do_div(n, 100*1000*1000));
     260             :         /* 1 <= n <= 1.6e11 */
     261       24813 :         if (n >= 100*1000*1000)
     262         148 :                 buf = put_dec_full8(buf, do_div(n, 100*1000*1000));
     263             :         /* 1 <= n < 1e8 */
     264       24813 :         return put_dec_trunc8(buf, n);
     265             : }
     266             : 
     267             : #elif BITS_PER_LONG == 32 && BITS_PER_LONG_LONG == 64
     268             : 
     269             : static void
     270             : put_dec_full4(char *buf, unsigned r)
     271             : {
     272             :         unsigned q;
     273             : 
     274             :         /* 0 <= r < 10^4 */
     275             :         q = (r * 0x147b) >> 19;
     276             :         *((u16 *)buf) = decpair[r - 100*q];
     277             :         buf += 2;
     278             :         /* 0 <= q < 100 */
     279             :         *((u16 *)buf) = decpair[q];
     280             : }
     281             : 
     282             : /*
     283             :  * Call put_dec_full4 on x % 10000, return x / 10000.
     284             :  * The approximation x/10000 == (x * 0x346DC5D7) >> 43
     285             :  * holds for all x < 1,128,869,999.  The largest value this
     286             :  * helper will ever be asked to convert is 1,125,520,955.
     287             :  * (second call in the put_dec code, assuming n is all-ones).
     288             :  */
     289             : static noinline_for_stack
     290             : unsigned put_dec_helper4(char *buf, unsigned x)
     291             : {
     292             :         uint32_t q = (x * (uint64_t)0x346DC5D7) >> 43;
     293             : 
     294             :         put_dec_full4(buf, x - q * 10000);
     295             :         return q;
     296             : }
     297             : 
     298             : /* Based on code by Douglas W. Jones found at
     299             :  * <http://www.cs.uiowa.edu/~jones/bcd/decimal.html#sixtyfour>
     300             :  * (with permission from the author).
     301             :  * Performs no 64-bit division and hence should be fast on 32-bit machines.
     302             :  */
     303             : static
     304             : char *put_dec(char *buf, unsigned long long n)
     305             : {
     306             :         uint32_t d3, d2, d1, q, h;
     307             : 
     308             :         if (n < 100*1000*1000)
     309             :                 return put_dec_trunc8(buf, n);
     310             : 
     311             :         d1  = ((uint32_t)n >> 16); /* implicit "& 0xffff" */
     312             :         h   = (n >> 32);
     313             :         d2  = (h      ) & 0xffff;
     314             :         d3  = (h >> 16); /* implicit "& 0xffff" */
     315             : 
     316             :         /* n = 2^48 d3 + 2^32 d2 + 2^16 d1 + d0
     317             :              = 281_4749_7671_0656 d3 + 42_9496_7296 d2 + 6_5536 d1 + d0 */
     318             :         q   = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff);
     319             :         q = put_dec_helper4(buf, q);
     320             : 
     321             :         q += 7671 * d3 + 9496 * d2 + 6 * d1;
     322             :         q = put_dec_helper4(buf+4, q);
     323             : 
     324             :         q += 4749 * d3 + 42 * d2;
     325             :         q = put_dec_helper4(buf+8, q);
     326             : 
     327             :         q += 281 * d3;
     328             :         buf += 12;
     329             :         if (q)
     330             :                 buf = put_dec_trunc8(buf, q);
     331             :         else while (buf[-1] == '0')
     332             :                 --buf;
     333             : 
     334             :         return buf;
     335             : }
     336             : 
     337             : #endif
     338             : 
     339             : /*
     340             :  * Convert passed number to decimal string.
     341             :  * Returns the length of string.  On buffer overflow, returns 0.
     342             :  *
     343             :  * If speed is not important, use snprintf(). It's easy to read the code.
     344             :  */
     345        7072 : int num_to_str(char *buf, int size, unsigned long long num, unsigned int width)
     346             : {
     347             :         /* put_dec requires 2-byte alignment of the buffer. */
     348        7072 :         char tmp[sizeof(num) * 3] __aligned(2);
     349        7072 :         int idx, len;
     350             : 
     351             :         /* put_dec() may work incorrectly for num = 0 (generate "", not "0") */
     352        7072 :         if (num <= 9) {
     353        3797 :                 tmp[0] = '0' + num;
     354        3797 :                 len = 1;
     355             :         } else {
     356        3275 :                 len = put_dec(tmp, num) - tmp;
     357             :         }
     358             : 
     359        7072 :         if (len > size || width > size)
     360             :                 return 0;
     361             : 
     362        7072 :         if (width > len) {
     363         864 :                 width = width - len;
     364        5151 :                 for (idx = 0; idx < width; idx++)
     365        4287 :                         buf[idx] = ' ';
     366             :         } else {
     367             :                 width = 0;
     368             :         }
     369             : 
     370       35502 :         for (idx = 0; idx < len; ++idx)
     371       28430 :                 buf[idx + width] = tmp[len - idx - 1];
     372             : 
     373        7072 :         return len + width;
     374             : }
     375             : 
     376             : #define SIGN    1               /* unsigned/signed, must be 1 */
     377             : #define LEFT    2               /* left justified */
     378             : #define PLUS    4               /* show plus */
     379             : #define SPACE   8               /* space if plus */
     380             : #define ZEROPAD 16              /* pad with zero, must be 16 == '0' - ' ' */
     381             : #define SMALL   32              /* use lowercase in hex (must be 32 == 0x20) */
     382             : #define SPECIAL 64              /* prefix hex with "0x", octal with "0" */
     383             : 
     384             : static_assert(ZEROPAD == ('0' - ' '));
     385             : static_assert(SMALL == ' ');
     386             : 
     387             : enum format_type {
     388             :         FORMAT_TYPE_NONE, /* Just a string part */
     389             :         FORMAT_TYPE_WIDTH,
     390             :         FORMAT_TYPE_PRECISION,
     391             :         FORMAT_TYPE_CHAR,
     392             :         FORMAT_TYPE_STR,
     393             :         FORMAT_TYPE_PTR,
     394             :         FORMAT_TYPE_PERCENT_CHAR,
     395             :         FORMAT_TYPE_INVALID,
     396             :         FORMAT_TYPE_LONG_LONG,
     397             :         FORMAT_TYPE_ULONG,
     398             :         FORMAT_TYPE_LONG,
     399             :         FORMAT_TYPE_UBYTE,
     400             :         FORMAT_TYPE_BYTE,
     401             :         FORMAT_TYPE_USHORT,
     402             :         FORMAT_TYPE_SHORT,
     403             :         FORMAT_TYPE_UINT,
     404             :         FORMAT_TYPE_INT,
     405             :         FORMAT_TYPE_SIZE_T,
     406             :         FORMAT_TYPE_PTRDIFF
     407             : };
     408             : 
     409             : struct printf_spec {
     410             :         unsigned int    type:8;         /* format_type enum */
     411             :         signed int      field_width:24; /* width of output field */
     412             :         unsigned int    flags:8;        /* flags to number() */
     413             :         unsigned int    base:8;         /* number base, 8, 10 or 16 only */
     414             :         signed int      precision:16;   /* # of digits/chars */
     415             : } __packed;
     416             : static_assert(sizeof(struct printf_spec) == 8);
     417             : 
     418             : #define FIELD_WIDTH_MAX ((1 << 23) - 1)
     419             : #define PRECISION_MAX ((1 << 15) - 1)
     420             : 
     421             : static noinline_for_stack
     422       40111 : char *number(char *buf, char *end, unsigned long long num,
     423             :              struct printf_spec spec)
     424             : {
     425             :         /* put_dec requires 2-byte alignment of the buffer. */
     426       40111 :         char tmp[3 * sizeof(num)] __aligned(2);
     427       40111 :         char sign;
     428       40111 :         char locase;
     429       40111 :         int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
     430       40111 :         int i;
     431       40111 :         bool is_zero = num == 0LL;
     432       40111 :         int field_width = spec.field_width;
     433       40111 :         int precision = spec.precision;
     434             : 
     435             :         /* locase = 0 or 0x20. ORing digits or letters with 'locase'
     436             :          * produces same digits or (maybe lowercased) letters */
     437       40111 :         locase = (spec.flags & SMALL);
     438       40111 :         if (spec.flags & LEFT)
     439          80 :                 spec.flags &= ~ZEROPAD;
     440       40111 :         sign = 0;
     441       40111 :         if (spec.flags & SIGN) {
     442       17304 :                 if ((signed long long)num < 0) {
     443           2 :                         sign = '-';
     444           2 :                         num = -(signed long long)num;
     445           2 :                         field_width--;
     446       17302 :                 } else if (spec.flags & PLUS) {
     447           0 :                         sign = '+';
     448           0 :                         field_width--;
     449       17302 :                 } else if (spec.flags & SPACE) {
     450           0 :                         sign = ' ';
     451           0 :                         field_width--;
     452             :                 }
     453             :         }
     454       40111 :         if (need_pfx) {
     455         315 :                 if (spec.base == 16)
     456         228 :                         field_width -= 2;
     457          87 :                 else if (!is_zero)
     458          60 :                         field_width--;
     459             :         }
     460             : 
     461             :         /* generate full string in tmp[], in reverse order */
     462       40111 :         i = 0;
     463       40111 :         if (num < spec.base)
     464       15157 :                 tmp[i++] = hex_asc_upper[num] | locase;
     465       24954 :         else if (spec.base != 10) { /* 8 or 16 */
     466        3415 :                 int mask = spec.base - 1;
     467        3415 :                 int shift = 3;
     468             : 
     469        3415 :                 if (spec.base == 16)
     470        1581 :                         shift = 4;
     471       11198 :                 do {
     472       11198 :                         tmp[i++] = (hex_asc_upper[((unsigned char)num) & mask] | locase);
     473       11198 :                         num >>= shift;
     474       11198 :                 } while (num);
     475             :         } else { /* base 10 */
     476       21539 :                 i = put_dec(tmp, num) - tmp;
     477             :         }
     478             : 
     479             :         /* printing 100 using %2d gives "100", not "00" */
     480       40111 :         if (i > precision)
     481             :                 precision = i;
     482             :         /* leading space padding */
     483       40111 :         field_width -= precision;
     484       40111 :         if (!(spec.flags & (ZEROPAD | LEFT))) {
     485       36330 :                 while (--field_width >= 0) {
     486          47 :                         if (buf < end)
     487          41 :                                 *buf = ' ';
     488          47 :                         ++buf;
     489             :                 }
     490             :         }
     491             :         /* sign */
     492       40111 :         if (sign) {
     493           2 :                 if (buf < end)
     494           1 :                         *buf = sign;
     495           2 :                 ++buf;
     496             :         }
     497             :         /* "0x" / "0" prefix */
     498       40111 :         if (need_pfx) {
     499         315 :                 if (spec.base == 16 || !is_zero) {
     500         288 :                         if (buf < end)
     501         256 :                                 *buf = '0';
     502         288 :                         ++buf;
     503             :                 }
     504         315 :                 if (spec.base == 16) {
     505         228 :                         if (buf < end)
     506         194 :                                 *buf = ('X' | locase);
     507         228 :                         ++buf;
     508             :                 }
     509             :         }
     510             :         /* zero or space padding */
     511       40111 :         if (!(spec.flags & LEFT)) {
     512       40031 :                 char c = ' ' + (spec.flags & ZEROPAD);
     513             : 
     514       44980 :                 while (--field_width >= 0) {
     515        4949 :                         if (buf < end)
     516        4354 :                                 *buf = c;
     517        4949 :                         ++buf;
     518             :                 }
     519             :         }
     520             :         /* hmm even more zero padding? */
     521       40111 :         while (i <= --precision) {
     522           0 :                 if (buf < end)
     523           0 :                         *buf = '0';
     524           0 :                 ++buf;
     525             :         }
     526             :         /* actual digits of result */
     527      118092 :         while (--i >= 0) {
     528       77981 :                 if (buf < end)
     529       75540 :                         *buf = tmp[i];
     530       77981 :                 ++buf;
     531             :         }
     532             :         /* trailing space padding */
     533       41361 :         while (--field_width >= 0) {
     534        1250 :                 if (buf < end)
     535        1250 :                         *buf = ' ';
     536        1250 :                 ++buf;
     537             :         }
     538             : 
     539       40111 :         return buf;
     540             : }
     541             : 
     542             : static noinline_for_stack
     543           0 : char *special_hex_number(char *buf, char *end, unsigned long long num, int size)
     544             : {
     545           0 :         struct printf_spec spec;
     546             : 
     547           0 :         spec.type = FORMAT_TYPE_PTR;
     548           0 :         spec.field_width = 2 + 2 * size;        /* 0x + hex */
     549           0 :         spec.flags = SPECIAL | SMALL | ZEROPAD;
     550           0 :         spec.base = 16;
     551           0 :         spec.precision = -1;
     552             : 
     553           0 :         return number(buf, end, num, spec);
     554             : }
     555             : 
     556           2 : static void move_right(char *buf, char *end, unsigned len, unsigned spaces)
     557             : {
     558           2 :         size_t size;
     559           2 :         if (buf >= end)      /* nowhere to put anything */
     560             :                 return;
     561           2 :         size = end - buf;
     562           2 :         if (size <= spaces) {
     563           0 :                 memset(buf, ' ', size);
     564           0 :                 return;
     565             :         }
     566           2 :         if (len) {
     567           2 :                 if (len > size - spaces)
     568           0 :                         len = size - spaces;
     569           2 :                 memmove(buf + spaces, buf, len);
     570             :         }
     571           2 :         memset(buf, ' ', spaces);
     572             : }
     573             : 
     574             : /*
     575             :  * Handle field width padding for a string.
     576             :  * @buf: current buffer position
     577             :  * @n: length of string
     578             :  * @end: end of output buffer
     579             :  * @spec: for field width and flags
     580             :  * Returns: new buffer position after padding.
     581             :  */
     582             : static noinline_for_stack
     583       19445 : char *widen_string(char *buf, int n, char *end, struct printf_spec spec)
     584             : {
     585       19445 :         unsigned spaces;
     586             : 
     587       19445 :         if (likely(n >= spec.field_width))
     588             :                 return buf;
     589             :         /* we want to pad the sucker */
     590         236 :         spaces = spec.field_width - n;
     591         236 :         if (!(spec.flags & LEFT)) {
     592           2 :                 move_right(buf - n, end, n, spaces);
     593           2 :                 return buf + spaces;
     594             :         }
     595        2174 :         while (spaces--) {
     596        1940 :                 if (buf < end)
     597        1935 :                         *buf = ' ';
     598        1940 :                 ++buf;
     599             :         }
     600             :         return buf;
     601             : }
     602             : 
     603             : /* Handle string from a well known address. */
     604       19445 : static char *string_nocheck(char *buf, char *end, const char *s,
     605             :                             struct printf_spec spec)
     606             : {
     607       19445 :         int len = 0;
     608       19445 :         int lim = spec.precision;
     609             : 
     610      256518 :         while (lim--) {
     611      256516 :                 char c = *s++;
     612      256516 :                 if (!c)
     613             :                         break;
     614      237073 :                 if (buf < end)
     615      172775 :                         *buf = c;
     616      237073 :                 ++buf;
     617      237073 :                 ++len;
     618             :         }
     619       19445 :         return widen_string(buf, len, end, spec);
     620             : }
     621             : 
     622           0 : static char *err_ptr(char *buf, char *end, void *ptr,
     623             :                      struct printf_spec spec)
     624             : {
     625           0 :         int err = PTR_ERR(ptr);
     626           0 :         const char *sym = errname(err);
     627             : 
     628           0 :         if (sym)
     629             :                 return string_nocheck(buf, end, sym, spec);
     630             : 
     631             :         /*
     632             :          * Somebody passed ERR_PTR(-1234) or some other non-existing
     633             :          * Efoo - or perhaps CONFIG_SYMBOLIC_ERRNAME=n. Fall back to
     634             :          * printing it as its decimal representation.
     635             :          */
     636           0 :         spec.flags |= SIGN;
     637           0 :         spec.base = 10;
     638           0 :         return number(buf, end, err, spec);
     639             : }
     640             : 
     641             : /* Be careful: error messages must fit into the given buffer. */
     642           2 : static char *error_string(char *buf, char *end, const char *s,
     643             :                           struct printf_spec spec)
     644             : {
     645             :         /*
     646             :          * Hard limit to avoid a completely insane messages. It actually
     647             :          * works pretty well because most error messages are in
     648             :          * the many pointer format modifiers.
     649             :          */
     650           2 :         if (spec.precision == -1)
     651           2 :                 spec.precision = 2 * sizeof(void *);
     652             : 
     653           2 :         return string_nocheck(buf, end, s, spec);
     654             : }
     655             : 
     656             : /*
     657             :  * Do not call any complex external code here. Nested printk()/vsprintf()
     658             :  * might cause infinite loops. Failures might break printk() and would
     659             :  * be hard to debug.
     660             :  */
     661       19497 : static const char *check_pointer_msg(const void *ptr)
     662             : {
     663       19497 :         if (!ptr)
     664             :                 return "(null)";
     665             : 
     666       19495 :         if ((unsigned long)ptr < PAGE_SIZE || IS_ERR_VALUE(ptr))
     667             :                 return "(efault)";
     668             : 
     669             :         return NULL;
     670             : }
     671             : 
     672       19497 : static int check_pointer(char **buf, char *end, const void *ptr,
     673             :                          struct printf_spec spec)
     674             : {
     675       19497 :         const char *err_msg;
     676             : 
     677       19497 :         err_msg = check_pointer_msg(ptr);
     678           2 :         if (err_msg) {
     679           2 :                 *buf = error_string(*buf, end, err_msg, spec);
     680           2 :                 return -EFAULT;
     681             :         }
     682             : 
     683             :         return 0;
     684             : }
     685             : 
     686             : static noinline_for_stack
     687       19347 : char *string(char *buf, char *end, const char *s,
     688             :              struct printf_spec spec)
     689             : {
     690       19347 :         if (check_pointer(&buf, end, s, spec))
     691           2 :                 return buf;
     692             : 
     693       19345 :         return string_nocheck(buf, end, s, spec);
     694             : }
     695             : 
     696           8 : static char *pointer_string(char *buf, char *end,
     697             :                             const void *ptr,
     698             :                             struct printf_spec spec)
     699             : {
     700           8 :         spec.base = 16;
     701           8 :         spec.flags |= SMALL;
     702           8 :         if (spec.field_width == -1) {
     703           8 :                 spec.field_width = 2 * sizeof(ptr);
     704           8 :                 spec.flags |= ZEROPAD;
     705             :         }
     706             : 
     707           8 :         return number(buf, end, (unsigned long int)ptr, spec);
     708             : }
     709             : 
     710             : /* Make pointers available for printing early in the boot sequence. */
     711             : static int debug_boot_weak_hash __ro_after_init;
     712             : 
     713           0 : static int __init debug_boot_weak_hash_enable(char *str)
     714             : {
     715           0 :         debug_boot_weak_hash = 1;
     716           0 :         pr_info("debug_boot_weak_hash enabled\n");
     717           0 :         return 0;
     718             : }
     719             : early_param("debug_boot_weak_hash", debug_boot_weak_hash_enable);
     720             : 
     721             : static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key);
     722             : static siphash_key_t ptr_key __read_mostly;
     723             : 
     724           0 : static void enable_ptr_key_workfn(struct work_struct *work)
     725             : {
     726           0 :         get_random_bytes(&ptr_key, sizeof(ptr_key));
     727             :         /* Needs to run from preemptible context */
     728           0 :         static_branch_disable(&not_filled_random_ptr_key);
     729           0 : }
     730             : 
     731             : static DECLARE_WORK(enable_ptr_key_work, enable_ptr_key_workfn);
     732             : 
     733           0 : static void fill_random_ptr_key(struct random_ready_callback *unused)
     734             : {
     735             :         /* This may be in an interrupt handler. */
     736           0 :         queue_work(system_unbound_wq, &enable_ptr_key_work);
     737           0 : }
     738             : 
     739             : static struct random_ready_callback random_ready = {
     740             :         .func = fill_random_ptr_key
     741             : };
     742             : 
     743           1 : static int __init initialize_ptr_random(void)
     744             : {
     745           1 :         int key_size = sizeof(ptr_key);
     746           1 :         int ret;
     747             : 
     748             :         /* Use hw RNG if available. */
     749           1 :         if (get_random_bytes_arch(&ptr_key, key_size) == key_size) {
     750           1 :                 static_branch_disable(&not_filled_random_ptr_key);
     751           1 :                 return 0;
     752             :         }
     753             : 
     754           0 :         ret = add_random_ready_callback(&random_ready);
     755           0 :         if (!ret) {
     756             :                 return 0;
     757           0 :         } else if (ret == -EALREADY) {
     758             :                 /* This is in preemptible context */
     759           0 :                 enable_ptr_key_workfn(&enable_ptr_key_work);
     760           0 :                 return 0;
     761             :         }
     762             : 
     763             :         return ret;
     764             : }
     765             : early_initcall(initialize_ptr_random);
     766             : 
     767             : /* Maps a pointer to a 32 bit unique identifier. */
     768           0 : static inline int __ptr_to_hashval(const void *ptr, unsigned long *hashval_out)
     769             : {
     770           0 :         unsigned long hashval;
     771             : 
     772           0 :         if (static_branch_unlikely(&not_filled_random_ptr_key))
     773             :                 return -EAGAIN;
     774             : 
     775             : #ifdef CONFIG_64BIT
     776           0 :         hashval = (unsigned long)siphash_1u64((u64)ptr, &ptr_key);
     777             :         /*
     778             :          * Mask off the first 32 bits, this makes explicit that we have
     779             :          * modified the address (and 32 bits is plenty for a unique ID).
     780             :          */
     781           0 :         hashval = hashval & 0xffffffff;
     782             : #else
     783             :         hashval = (unsigned long)siphash_1u32((u32)ptr, &ptr_key);
     784             : #endif
     785           0 :         *hashval_out = hashval;
     786           0 :         return 0;
     787             : }
     788             : 
     789           0 : int ptr_to_hashval(const void *ptr, unsigned long *hashval_out)
     790             : {
     791           0 :         return __ptr_to_hashval(ptr, hashval_out);
     792             : }
     793             : 
     794           0 : static char *ptr_to_id(char *buf, char *end, const void *ptr,
     795             :                        struct printf_spec spec)
     796             : {
     797           0 :         const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
     798           0 :         unsigned long hashval;
     799           0 :         int ret;
     800             : 
     801             :         /*
     802             :          * Print the real pointer value for NULL and error pointers,
     803             :          * as they are not actual addresses.
     804             :          */
     805           0 :         if (IS_ERR_OR_NULL(ptr))
     806           0 :                 return pointer_string(buf, end, ptr, spec);
     807             : 
     808             :         /* When debugging early boot use non-cryptographically secure hash. */
     809           0 :         if (unlikely(debug_boot_weak_hash)) {
     810           0 :                 hashval = hash_long((unsigned long)ptr, 32);
     811           0 :                 return pointer_string(buf, end, (const void *)hashval, spec);
     812             :         }
     813             : 
     814           0 :         ret = __ptr_to_hashval(ptr, &hashval);
     815           0 :         if (ret) {
     816           0 :                 spec.field_width = 2 * sizeof(ptr);
     817             :                 /* string length must be less than default_width */
     818           0 :                 return error_string(buf, end, str, spec);
     819             :         }
     820             : 
     821           0 :         return pointer_string(buf, end, (const void *)hashval, spec);
     822             : }
     823             : 
     824             : int kptr_restrict __read_mostly;
     825             : 
     826             : static noinline_for_stack
     827           0 : char *restricted_pointer(char *buf, char *end, const void *ptr,
     828             :                          struct printf_spec spec)
     829             : {
     830           0 :         switch (kptr_restrict) {
     831           0 :         case 0:
     832             :                 /* Handle as %p, hash and do _not_ leak addresses. */
     833           0 :                 return ptr_to_id(buf, end, ptr, spec);
     834             :         case 1: {
     835           0 :                 const struct cred *cred;
     836             : 
     837             :                 /*
     838             :                  * kptr_restrict==1 cannot be used in IRQ context
     839             :                  * because its test for CAP_SYSLOG would be meaningless.
     840             :                  */
     841           0 :                 if (in_irq() || in_serving_softirq() || in_nmi()) {
     842           0 :                         if (spec.field_width == -1)
     843           0 :                                 spec.field_width = 2 * sizeof(ptr);
     844           0 :                         return error_string(buf, end, "pK-error", spec);
     845             :                 }
     846             : 
     847             :                 /*
     848             :                  * Only print the real pointer value if the current
     849             :                  * process has CAP_SYSLOG and is running with the
     850             :                  * same credentials it started with. This is because
     851             :                  * access to files is checked at open() time, but %pK
     852             :                  * checks permission at read() time. We don't want to
     853             :                  * leak pointer values if a binary opens a file using
     854             :                  * %pK and then elevates privileges before reading it.
     855             :                  */
     856           0 :                 cred = current_cred();
     857           0 :                 if (!has_capability_noaudit(current, CAP_SYSLOG) ||
     858           0 :                     !uid_eq(cred->euid, cred->uid) ||
     859           0 :                     !gid_eq(cred->egid, cred->gid))
     860             :                         ptr = NULL;
     861             :                 break;
     862             :         }
     863             :         case 2:
     864             :         default:
     865             :                 /* Always print 0's for %pK */
     866             :                 ptr = NULL;
     867             :                 break;
     868             :         }
     869             : 
     870           0 :         return pointer_string(buf, end, ptr, spec);
     871             : }
     872             : 
     873             : static noinline_for_stack
     874           0 : char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_spec spec,
     875             :                   const char *fmt)
     876             : {
     877           0 :         const char *array[4], *s;
     878           0 :         const struct dentry *p;
     879           0 :         int depth;
     880           0 :         int i, n;
     881             : 
     882           0 :         switch (fmt[1]) {
     883           0 :                 case '2': case '3': case '4':
     884           0 :                         depth = fmt[1] - '0';
     885           0 :                         break;
     886             :                 default:
     887             :                         depth = 1;
     888             :         }
     889             : 
     890           0 :         rcu_read_lock();
     891           0 :         for (i = 0; i < depth; i++, d = p) {
     892           0 :                 if (check_pointer(&buf, end, d, spec)) {
     893           0 :                         rcu_read_unlock();
     894           0 :                         return buf;
     895             :                 }
     896             : 
     897           0 :                 p = READ_ONCE(d->d_parent);
     898           0 :                 array[i] = READ_ONCE(d->d_name.name);
     899           0 :                 if (p == d) {
     900           0 :                         if (i)
     901           0 :                                 array[i] = "";
     902           0 :                         i++;
     903           0 :                         break;
     904             :                 }
     905             :         }
     906           0 :         s = array[--i];
     907           0 :         for (n = 0; n != spec.precision; n++, buf++) {
     908           0 :                 char c = *s++;
     909           0 :                 if (!c) {
     910           0 :                         if (!i)
     911             :                                 break;
     912           0 :                         c = '/';
     913           0 :                         s = array[--i];
     914             :                 }
     915           0 :                 if (buf < end)
     916           0 :                         *buf = c;
     917             :         }
     918           0 :         rcu_read_unlock();
     919           0 :         return widen_string(buf, n, end, spec);
     920             : }
     921             : 
     922             : static noinline_for_stack
     923           0 : char *file_dentry_name(char *buf, char *end, const struct file *f,
     924             :                         struct printf_spec spec, const char *fmt)
     925             : {
     926           0 :         if (check_pointer(&buf, end, f, spec))
     927           0 :                 return buf;
     928             : 
     929           0 :         return dentry_name(buf, end, f->f_path.dentry, spec, fmt);
     930             : }
     931             : #ifdef CONFIG_BLOCK
     932             : static noinline_for_stack
     933           2 : char *bdev_name(char *buf, char *end, struct block_device *bdev,
     934             :                 struct printf_spec spec, const char *fmt)
     935             : {
     936           2 :         struct gendisk *hd;
     937             : 
     938           2 :         if (check_pointer(&buf, end, bdev, spec))
     939           0 :                 return buf;
     940             : 
     941           2 :         hd = bdev->bd_disk;
     942           2 :         buf = string(buf, end, hd->disk_name, spec);
     943           2 :         if (bdev->bd_partno) {
     944           2 :                 if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) {
     945           0 :                         if (buf < end)
     946           0 :                                 *buf = 'p';
     947           0 :                         buf++;
     948             :                 }
     949           2 :                 buf = number(buf, end, bdev->bd_partno, spec);
     950             :         }
     951           2 :         return buf;
     952             : }
     953             : #endif
     954             : 
     955             : static noinline_for_stack
     956          82 : char *symbol_string(char *buf, char *end, void *ptr,
     957             :                     struct printf_spec spec, const char *fmt)
     958             : {
     959          82 :         unsigned long value;
     960             : #ifdef CONFIG_KALLSYMS
     961          82 :         char sym[KSYM_SYMBOL_LEN];
     962             : #endif
     963             : 
     964          82 :         if (fmt[1] == 'R')
     965           0 :                 ptr = __builtin_extract_return_addr(ptr);
     966          82 :         value = (unsigned long)ptr;
     967             : 
     968             : #ifdef CONFIG_KALLSYMS
     969          82 :         if (*fmt == 'B')
     970          68 :                 sprint_backtrace(sym, value);
     971          14 :         else if (*fmt != 's')
     972          14 :                 sprint_symbol(sym, value);
     973             :         else
     974           0 :                 sprint_symbol_no_offset(sym, value);
     975             : 
     976          82 :         return string_nocheck(buf, end, sym, spec);
     977             : #else
     978             :         return special_hex_number(buf, end, value, sizeof(void *));
     979             : #endif
     980             : }
     981             : 
     982             : static const struct printf_spec default_str_spec = {
     983             :         .field_width = -1,
     984             :         .precision = -1,
     985             : };
     986             : 
     987             : static const struct printf_spec default_flag_spec = {
     988             :         .base = 16,
     989             :         .precision = -1,
     990             :         .flags = SPECIAL | SMALL,
     991             : };
     992             : 
     993             : static const struct printf_spec default_dec_spec = {
     994             :         .base = 10,
     995             :         .precision = -1,
     996             : };
     997             : 
     998             : static const struct printf_spec default_dec02_spec = {
     999             :         .base = 10,
    1000             :         .field_width = 2,
    1001             :         .precision = -1,
    1002             :         .flags = ZEROPAD,
    1003             : };
    1004             : 
    1005             : static const struct printf_spec default_dec04_spec = {
    1006             :         .base = 10,
    1007             :         .field_width = 4,
    1008             :         .precision = -1,
    1009             :         .flags = ZEROPAD,
    1010             : };
    1011             : 
    1012             : static noinline_for_stack
    1013           0 : char *resource_string(char *buf, char *end, struct resource *res,
    1014             :                       struct printf_spec spec, const char *fmt)
    1015             : {
    1016             : #ifndef IO_RSRC_PRINTK_SIZE
    1017             : #define IO_RSRC_PRINTK_SIZE     6
    1018             : #endif
    1019             : 
    1020             : #ifndef MEM_RSRC_PRINTK_SIZE
    1021             : #define MEM_RSRC_PRINTK_SIZE    10
    1022             : #endif
    1023           0 :         static const struct printf_spec io_spec = {
    1024             :                 .base = 16,
    1025             :                 .field_width = IO_RSRC_PRINTK_SIZE,
    1026             :                 .precision = -1,
    1027             :                 .flags = SPECIAL | SMALL | ZEROPAD,
    1028             :         };
    1029           0 :         static const struct printf_spec mem_spec = {
    1030             :                 .base = 16,
    1031             :                 .field_width = MEM_RSRC_PRINTK_SIZE,
    1032             :                 .precision = -1,
    1033             :                 .flags = SPECIAL | SMALL | ZEROPAD,
    1034             :         };
    1035           0 :         static const struct printf_spec bus_spec = {
    1036             :                 .base = 16,
    1037             :                 .field_width = 2,
    1038             :                 .precision = -1,
    1039             :                 .flags = SMALL | ZEROPAD,
    1040             :         };
    1041           0 :         static const struct printf_spec str_spec = {
    1042             :                 .field_width = -1,
    1043             :                 .precision = 10,
    1044             :                 .flags = LEFT,
    1045             :         };
    1046             : 
    1047             :         /* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8)
    1048             :          * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */
    1049             : #define RSRC_BUF_SIZE           ((2 * sizeof(resource_size_t)) + 4)
    1050             : #define FLAG_BUF_SIZE           (2 * sizeof(res->flags))
    1051             : #define DECODED_BUF_SIZE        sizeof("[mem - 64bit pref window disabled]")
    1052             : #define RAW_BUF_SIZE            sizeof("[mem - flags 0x]")
    1053           0 :         char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
    1054             :                      2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
    1055             : 
    1056           0 :         char *p = sym, *pend = sym + sizeof(sym);
    1057           0 :         int decode = (fmt[0] == 'R') ? 1 : 0;
    1058           0 :         const struct printf_spec *specp;
    1059             : 
    1060           0 :         if (check_pointer(&buf, end, res, spec))
    1061           0 :                 return buf;
    1062             : 
    1063           0 :         *p++ = '[';
    1064           0 :         if (res->flags & IORESOURCE_IO) {
    1065           0 :                 p = string_nocheck(p, pend, "io  ", str_spec);
    1066           0 :                 specp = &io_spec;
    1067           0 :         } else if (res->flags & IORESOURCE_MEM) {
    1068           0 :                 p = string_nocheck(p, pend, "mem ", str_spec);
    1069           0 :                 specp = &mem_spec;
    1070           0 :         } else if (res->flags & IORESOURCE_IRQ) {
    1071           0 :                 p = string_nocheck(p, pend, "irq ", str_spec);
    1072           0 :                 specp = &default_dec_spec;
    1073           0 :         } else if (res->flags & IORESOURCE_DMA) {
    1074           0 :                 p = string_nocheck(p, pend, "dma ", str_spec);
    1075           0 :                 specp = &default_dec_spec;
    1076           0 :         } else if (res->flags & IORESOURCE_BUS) {
    1077           0 :                 p = string_nocheck(p, pend, "bus ", str_spec);
    1078           0 :                 specp = &bus_spec;
    1079             :         } else {
    1080           0 :                 p = string_nocheck(p, pend, "??? ", str_spec);
    1081           0 :                 specp = &mem_spec;
    1082           0 :                 decode = 0;
    1083             :         }
    1084           0 :         if (decode && res->flags & IORESOURCE_UNSET) {
    1085           0 :                 p = string_nocheck(p, pend, "size ", str_spec);
    1086           0 :                 p = number(p, pend, resource_size(res), *specp);
    1087             :         } else {
    1088           0 :                 p = number(p, pend, res->start, *specp);
    1089           0 :                 if (res->start != res->end) {
    1090           0 :                         *p++ = '-';
    1091           0 :                         p = number(p, pend, res->end, *specp);
    1092             :                 }
    1093             :         }
    1094           0 :         if (decode) {
    1095           0 :                 if (res->flags & IORESOURCE_MEM_64)
    1096           0 :                         p = string_nocheck(p, pend, " 64bit", str_spec);
    1097           0 :                 if (res->flags & IORESOURCE_PREFETCH)
    1098           0 :                         p = string_nocheck(p, pend, " pref", str_spec);
    1099           0 :                 if (res->flags & IORESOURCE_WINDOW)
    1100           0 :                         p = string_nocheck(p, pend, " window", str_spec);
    1101           0 :                 if (res->flags & IORESOURCE_DISABLED)
    1102           0 :                         p = string_nocheck(p, pend, " disabled", str_spec);
    1103             :         } else {
    1104           0 :                 p = string_nocheck(p, pend, " flags ", str_spec);
    1105           0 :                 p = number(p, pend, res->flags, default_flag_spec);
    1106             :         }
    1107           0 :         *p++ = ']';
    1108           0 :         *p = '\0';
    1109             : 
    1110           0 :         return string_nocheck(buf, end, sym, spec);
    1111             : }
    1112             : 
    1113             : static noinline_for_stack
    1114          10 : char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
    1115             :                  const char *fmt)
    1116             : {
    1117          10 :         int i, len = 1;         /* if we pass '%ph[CDN]', field width remains
    1118             :                                    negative value, fallback to the default */
    1119          10 :         char separator;
    1120             : 
    1121          10 :         if (spec.field_width == 0)
    1122             :                 /* nothing to print */
    1123           0 :                 return buf;
    1124             : 
    1125          10 :         if (check_pointer(&buf, end, addr, spec))
    1126           0 :                 return buf;
    1127             : 
    1128          10 :         switch (fmt[1]) {
    1129             :         case 'C':
    1130             :                 separator = ':';
    1131             :                 break;
    1132             :         case 'D':
    1133             :                 separator = '-';
    1134             :                 break;
    1135             :         case 'N':
    1136             :                 separator = 0;
    1137             :                 break;
    1138             :         default:
    1139             :                 separator = ' ';
    1140             :                 break;
    1141             :         }
    1142             : 
    1143          10 :         if (spec.field_width > 0)
    1144          10 :                 len = min_t(int, spec.field_width, 64);
    1145             : 
    1146         274 :         for (i = 0; i < len; ++i) {
    1147         264 :                 if (buf < end)
    1148         140 :                         *buf = hex_asc_hi(addr[i]);
    1149         264 :                 ++buf;
    1150         264 :                 if (buf < end)
    1151         140 :                         *buf = hex_asc_lo(addr[i]);
    1152         264 :                 ++buf;
    1153             : 
    1154         264 :                 if (separator && i != len - 1) {
    1155         254 :                         if (buf < end)
    1156         132 :                                 *buf = separator;
    1157         254 :                         ++buf;
    1158             :                 }
    1159             :         }
    1160             : 
    1161          10 :         return buf;
    1162             : }
    1163             : 
    1164             : static noinline_for_stack
    1165          56 : char *bitmap_string(char *buf, char *end, unsigned long *bitmap,
    1166             :                     struct printf_spec spec, const char *fmt)
    1167             : {
    1168          56 :         const int CHUNKSZ = 32;
    1169          56 :         int nr_bits = max_t(int, spec.field_width, 0);
    1170          56 :         int i, chunksz;
    1171          56 :         bool first = true;
    1172             : 
    1173          56 :         if (check_pointer(&buf, end, bitmap, spec))
    1174           0 :                 return buf;
    1175             : 
    1176             :         /* reused to print numbers */
    1177          56 :         spec = (struct printf_spec){ .flags = SMALL | ZEROPAD, .base = 16 };
    1178             : 
    1179          56 :         chunksz = nr_bits & (CHUNKSZ - 1);
    1180          56 :         if (chunksz == 0)
    1181           0 :                 chunksz = CHUNKSZ;
    1182             : 
    1183          56 :         i = ALIGN(nr_bits, CHUNKSZ) - CHUNKSZ;
    1184         112 :         for (; i >= 0; i -= CHUNKSZ) {
    1185          56 :                 u32 chunkmask, val;
    1186          56 :                 int word, bit;
    1187             : 
    1188          56 :                 chunkmask = ((1ULL << chunksz) - 1);
    1189          56 :                 word = i / BITS_PER_LONG;
    1190          56 :                 bit = i % BITS_PER_LONG;
    1191          56 :                 val = (bitmap[word] >> bit) & chunkmask;
    1192             : 
    1193          56 :                 if (!first) {
    1194           0 :                         if (buf < end)
    1195           0 :                                 *buf = ',';
    1196           0 :                         buf++;
    1197             :                 }
    1198          56 :                 first = false;
    1199             : 
    1200          56 :                 spec.field_width = DIV_ROUND_UP(chunksz, 4);
    1201          56 :                 buf = number(buf, end, val, spec);
    1202             : 
    1203          56 :                 chunksz = CHUNKSZ;
    1204             :         }
    1205          56 :         return buf;
    1206             : }
    1207             : 
    1208             : static noinline_for_stack
    1209          56 : char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
    1210             :                          struct printf_spec spec, const char *fmt)
    1211             : {
    1212          56 :         int nr_bits = max_t(int, spec.field_width, 0);
    1213             :         /* current bit is 'cur', most recently seen range is [rbot, rtop] */
    1214          56 :         int cur, rbot, rtop;
    1215          56 :         bool first = true;
    1216             : 
    1217          56 :         if (check_pointer(&buf, end, bitmap, spec))
    1218           0 :                 return buf;
    1219             : 
    1220          56 :         rbot = cur = find_first_bit(bitmap, nr_bits);
    1221         280 :         while (cur < nr_bits) {
    1222         224 :                 rtop = cur;
    1223         224 :                 cur = find_next_bit(bitmap, nr_bits, cur + 1);
    1224         224 :                 if (cur < nr_bits && cur <= rtop + 1)
    1225         168 :                         continue;
    1226             : 
    1227          56 :                 if (!first) {
    1228           0 :                         if (buf < end)
    1229           0 :                                 *buf = ',';
    1230           0 :                         buf++;
    1231             :                 }
    1232          56 :                 first = false;
    1233             : 
    1234          56 :                 buf = number(buf, end, rbot, default_dec_spec);
    1235          56 :                 if (rbot < rtop) {
    1236          56 :                         if (buf < end)
    1237          56 :                                 *buf = '-';
    1238          56 :                         buf++;
    1239             : 
    1240          56 :                         buf = number(buf, end, rtop, default_dec_spec);
    1241             :                 }
    1242             : 
    1243             :                 rbot = cur;
    1244             :         }
    1245          56 :         return buf;
    1246             : }
    1247             : 
    1248             : static noinline_for_stack
    1249           0 : char *mac_address_string(char *buf, char *end, u8 *addr,
    1250             :                          struct printf_spec spec, const char *fmt)
    1251             : {
    1252           0 :         char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
    1253           0 :         char *p = mac_addr;
    1254           0 :         int i;
    1255           0 :         char separator;
    1256           0 :         bool reversed = false;
    1257             : 
    1258           0 :         if (check_pointer(&buf, end, addr, spec))
    1259           0 :                 return buf;
    1260             : 
    1261           0 :         switch (fmt[1]) {
    1262             :         case 'F':
    1263             :                 separator = '-';
    1264             :                 break;
    1265             : 
    1266           0 :         case 'R':
    1267           0 :                 reversed = true;
    1268             :                 fallthrough;
    1269             : 
    1270             :         default:
    1271             :                 separator = ':';
    1272             :                 break;
    1273             :         }
    1274             : 
    1275           0 :         for (i = 0; i < 6; i++) {
    1276           0 :                 if (reversed)
    1277           0 :                         p = hex_byte_pack(p, addr[5 - i]);
    1278             :                 else
    1279           0 :                         p = hex_byte_pack(p, addr[i]);
    1280             : 
    1281           0 :                 if (fmt[0] == 'M' && i != 5)
    1282           0 :                         *p++ = separator;
    1283             :         }
    1284           0 :         *p = '\0';
    1285             : 
    1286           0 :         return string_nocheck(buf, end, mac_addr, spec);
    1287             : }
    1288             : 
    1289             : static noinline_for_stack
    1290           0 : char *ip4_string(char *p, const u8 *addr, const char *fmt)
    1291             : {
    1292           0 :         int i;
    1293           0 :         bool leading_zeros = (fmt[0] == 'i');
    1294           0 :         int index;
    1295           0 :         int step;
    1296             : 
    1297           0 :         switch (fmt[2]) {
    1298             :         case 'h':
    1299             : #ifdef __BIG_ENDIAN
    1300             :                 index = 0;
    1301             :                 step = 1;
    1302             : #else
    1303             :                 index = 3;
    1304             :                 step = -1;
    1305             : #endif
    1306             :                 break;
    1307             :         case 'l':
    1308             :                 index = 3;
    1309             :                 step = -1;
    1310             :                 break;
    1311           0 :         case 'n':
    1312             :         case 'b':
    1313             :         default:
    1314           0 :                 index = 0;
    1315           0 :                 step = 1;
    1316           0 :                 break;
    1317             :         }
    1318           0 :         for (i = 0; i < 4; i++) {
    1319           0 :                 char temp[4] __aligned(2);      /* hold each IP quad in reverse order */
    1320           0 :                 int digits = put_dec_trunc8(temp, addr[index]) - temp;
    1321           0 :                 if (leading_zeros) {
    1322           0 :                         if (digits < 3)
    1323           0 :                                 *p++ = '0';
    1324           0 :                         if (digits < 2)
    1325           0 :                                 *p++ = '0';
    1326             :                 }
    1327             :                 /* reverse the digits in the quad */
    1328           0 :                 while (digits--)
    1329           0 :                         *p++ = temp[digits];
    1330           0 :                 if (i < 3)
    1331           0 :                         *p++ = '.';
    1332           0 :                 index += step;
    1333             :         }
    1334           0 :         *p = '\0';
    1335             : 
    1336           0 :         return p;
    1337             : }
    1338             : 
    1339             : static noinline_for_stack
    1340           0 : char *ip6_compressed_string(char *p, const char *addr)
    1341             : {
    1342           0 :         int i, j, range;
    1343           0 :         unsigned char zerolength[8];
    1344           0 :         int longest = 1;
    1345           0 :         int colonpos = -1;
    1346           0 :         u16 word;
    1347           0 :         u8 hi, lo;
    1348           0 :         bool needcolon = false;
    1349           0 :         bool useIPv4;
    1350           0 :         struct in6_addr in6;
    1351             : 
    1352           0 :         memcpy(&in6, addr, sizeof(struct in6_addr));
    1353             : 
    1354           0 :         useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
    1355             : 
    1356           0 :         memset(zerolength, 0, sizeof(zerolength));
    1357             : 
    1358           0 :         if (useIPv4)
    1359             :                 range = 6;
    1360             :         else
    1361           0 :                 range = 8;
    1362             : 
    1363             :         /* find position of longest 0 run */
    1364           0 :         for (i = 0; i < range; i++) {
    1365           0 :                 for (j = i; j < range; j++) {
    1366           0 :                         if (in6.s6_addr16[j] != 0)
    1367             :                                 break;
    1368           0 :                         zerolength[i]++;
    1369             :                 }
    1370             :         }
    1371           0 :         for (i = 0; i < range; i++) {
    1372           0 :                 if (zerolength[i] > longest) {
    1373           0 :                         longest = zerolength[i];
    1374           0 :                         colonpos = i;
    1375             :                 }
    1376             :         }
    1377           0 :         if (longest == 1)               /* don't compress a single 0 */
    1378           0 :                 colonpos = -1;
    1379             : 
    1380             :         /* emit address */
    1381           0 :         for (i = 0; i < range; i++) {
    1382           0 :                 if (i == colonpos) {
    1383           0 :                         if (needcolon || i == 0)
    1384           0 :                                 *p++ = ':';
    1385           0 :                         *p++ = ':';
    1386           0 :                         needcolon = false;
    1387           0 :                         i += longest - 1;
    1388           0 :                         continue;
    1389             :                 }
    1390           0 :                 if (needcolon) {
    1391           0 :                         *p++ = ':';
    1392           0 :                         needcolon = false;
    1393             :                 }
    1394             :                 /* hex u16 without leading 0s */
    1395           0 :                 word = ntohs(in6.s6_addr16[i]);
    1396           0 :                 hi = word >> 8;
    1397           0 :                 lo = word & 0xff;
    1398           0 :                 if (hi) {
    1399           0 :                         if (hi > 0x0f)
    1400           0 :                                 p = hex_byte_pack(p, hi);
    1401             :                         else
    1402           0 :                                 *p++ = hex_asc_lo(hi);
    1403           0 :                         p = hex_byte_pack(p, lo);
    1404             :                 }
    1405           0 :                 else if (lo > 0x0f)
    1406           0 :                         p = hex_byte_pack(p, lo);
    1407             :                 else
    1408           0 :                         *p++ = hex_asc_lo(lo);
    1409             :                 needcolon = true;
    1410             :         }
    1411             : 
    1412           0 :         if (useIPv4) {
    1413           0 :                 if (needcolon)
    1414           0 :                         *p++ = ':';
    1415           0 :                 p = ip4_string(p, &in6.s6_addr[12], "I4");
    1416             :         }
    1417           0 :         *p = '\0';
    1418             : 
    1419           0 :         return p;
    1420             : }
    1421             : 
    1422             : static noinline_for_stack
    1423           0 : char *ip6_string(char *p, const char *addr, const char *fmt)
    1424             : {
    1425           0 :         int i;
    1426             : 
    1427           0 :         for (i = 0; i < 8; i++) {
    1428           0 :                 p = hex_byte_pack(p, *addr++);
    1429           0 :                 p = hex_byte_pack(p, *addr++);
    1430           0 :                 if (fmt[0] == 'I' && i != 7)
    1431           0 :                         *p++ = ':';
    1432             :         }
    1433           0 :         *p = '\0';
    1434             : 
    1435           0 :         return p;
    1436             : }
    1437             : 
    1438             : static noinline_for_stack
    1439           0 : char *ip6_addr_string(char *buf, char *end, const u8 *addr,
    1440             :                       struct printf_spec spec, const char *fmt)
    1441             : {
    1442           0 :         char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
    1443             : 
    1444           0 :         if (fmt[0] == 'I' && fmt[2] == 'c')
    1445           0 :                 ip6_compressed_string(ip6_addr, addr);
    1446             :         else
    1447           0 :                 ip6_string(ip6_addr, addr, fmt);
    1448             : 
    1449           0 :         return string_nocheck(buf, end, ip6_addr, spec);
    1450             : }
    1451             : 
    1452             : static noinline_for_stack
    1453           0 : char *ip4_addr_string(char *buf, char *end, const u8 *addr,
    1454             :                       struct printf_spec spec, const char *fmt)
    1455             : {
    1456           0 :         char ip4_addr[sizeof("255.255.255.255")];
    1457             : 
    1458           0 :         ip4_string(ip4_addr, addr, fmt);
    1459             : 
    1460           0 :         return string_nocheck(buf, end, ip4_addr, spec);
    1461             : }
    1462             : 
    1463             : static noinline_for_stack
    1464           0 : char *ip6_addr_string_sa(char *buf, char *end, const struct sockaddr_in6 *sa,
    1465             :                          struct printf_spec spec, const char *fmt)
    1466             : {
    1467           0 :         bool have_p = false, have_s = false, have_f = false, have_c = false;
    1468           0 :         char ip6_addr[sizeof("[xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255]") +
    1469             :                       sizeof(":12345") + sizeof("/123456789") +
    1470             :                       sizeof("%1234567890")];
    1471           0 :         char *p = ip6_addr, *pend = ip6_addr + sizeof(ip6_addr);
    1472           0 :         const u8 *addr = (const u8 *) &sa->sin6_addr;
    1473           0 :         char fmt6[2] = { fmt[0], '6' };
    1474           0 :         u8 off = 0;
    1475             : 
    1476           0 :         fmt++;
    1477           0 :         while (isalpha(*++fmt)) {
    1478           0 :                 switch (*fmt) {
    1479           0 :                 case 'p':
    1480           0 :                         have_p = true;
    1481           0 :                         break;
    1482           0 :                 case 'f':
    1483           0 :                         have_f = true;
    1484           0 :                         break;
    1485           0 :                 case 's':
    1486           0 :                         have_s = true;
    1487           0 :                         break;
    1488           0 :                 case 'c':
    1489           0 :                         have_c = true;
    1490           0 :                         break;
    1491             :                 }
    1492             :         }
    1493             : 
    1494           0 :         if (have_p || have_s || have_f) {
    1495           0 :                 *p = '[';
    1496           0 :                 off = 1;
    1497             :         }
    1498             : 
    1499           0 :         if (fmt6[0] == 'I' && have_c)
    1500           0 :                 p = ip6_compressed_string(ip6_addr + off, addr);
    1501             :         else
    1502           0 :                 p = ip6_string(ip6_addr + off, addr, fmt6);
    1503             : 
    1504           0 :         if (have_p || have_s || have_f)
    1505           0 :                 *p++ = ']';
    1506             : 
    1507           0 :         if (have_p) {
    1508           0 :                 *p++ = ':';
    1509           0 :                 p = number(p, pend, ntohs(sa->sin6_port), spec);
    1510             :         }
    1511           0 :         if (have_f) {
    1512           0 :                 *p++ = '/';
    1513           0 :                 p = number(p, pend, ntohl(sa->sin6_flowinfo &
    1514             :                                           IPV6_FLOWINFO_MASK), spec);
    1515             :         }
    1516           0 :         if (have_s) {
    1517           0 :                 *p++ = '%';
    1518           0 :                 p = number(p, pend, sa->sin6_scope_id, spec);
    1519             :         }
    1520           0 :         *p = '\0';
    1521             : 
    1522           0 :         return string_nocheck(buf, end, ip6_addr, spec);
    1523             : }
    1524             : 
    1525             : static noinline_for_stack
    1526           0 : char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
    1527             :                          struct printf_spec spec, const char *fmt)
    1528             : {
    1529           0 :         bool have_p = false;
    1530           0 :         char *p, ip4_addr[sizeof("255.255.255.255") + sizeof(":12345")];
    1531           0 :         char *pend = ip4_addr + sizeof(ip4_addr);
    1532           0 :         const u8 *addr = (const u8 *) &sa->sin_addr.s_addr;
    1533           0 :         char fmt4[3] = { fmt[0], '4', 0 };
    1534             : 
    1535           0 :         fmt++;
    1536           0 :         while (isalpha(*++fmt)) {
    1537           0 :                 switch (*fmt) {
    1538           0 :                 case 'p':
    1539           0 :                         have_p = true;
    1540           0 :                         break;
    1541           0 :                 case 'h':
    1542             :                 case 'l':
    1543             :                 case 'n':
    1544             :                 case 'b':
    1545           0 :                         fmt4[2] = *fmt;
    1546           0 :                         break;
    1547             :                 }
    1548             :         }
    1549             : 
    1550           0 :         p = ip4_string(ip4_addr, addr, fmt4);
    1551           0 :         if (have_p) {
    1552           0 :                 *p++ = ':';
    1553           0 :                 p = number(p, pend, ntohs(sa->sin_port), spec);
    1554             :         }
    1555           0 :         *p = '\0';
    1556             : 
    1557           0 :         return string_nocheck(buf, end, ip4_addr, spec);
    1558             : }
    1559             : 
    1560             : static noinline_for_stack
    1561           0 : char *ip_addr_string(char *buf, char *end, const void *ptr,
    1562             :                      struct printf_spec spec, const char *fmt)
    1563             : {
    1564           0 :         char *err_fmt_msg;
    1565             : 
    1566           0 :         if (check_pointer(&buf, end, ptr, spec))
    1567           0 :                 return buf;
    1568             : 
    1569           0 :         switch (fmt[1]) {
    1570           0 :         case '6':
    1571           0 :                 return ip6_addr_string(buf, end, ptr, spec, fmt);
    1572           0 :         case '4':
    1573           0 :                 return ip4_addr_string(buf, end, ptr, spec, fmt);
    1574           0 :         case 'S': {
    1575           0 :                 const union {
    1576             :                         struct sockaddr         raw;
    1577             :                         struct sockaddr_in      v4;
    1578             :                         struct sockaddr_in6     v6;
    1579           0 :                 } *sa = ptr;
    1580             : 
    1581           0 :                 switch (sa->raw.sa_family) {
    1582           0 :                 case AF_INET:
    1583           0 :                         return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt);
    1584           0 :                 case AF_INET6:
    1585           0 :                         return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
    1586           0 :                 default:
    1587           0 :                         return error_string(buf, end, "(einval)", spec);
    1588             :                 }}
    1589             :         }
    1590             : 
    1591           0 :         err_fmt_msg = fmt[0] == 'i' ? "(%pi?)" : "(%pI?)";
    1592           0 :         return error_string(buf, end, err_fmt_msg, spec);
    1593             : }
    1594             : 
    1595             : static noinline_for_stack
    1596           0 : char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
    1597             :                      const char *fmt)
    1598             : {
    1599           0 :         bool found = true;
    1600           0 :         int count = 1;
    1601           0 :         unsigned int flags = 0;
    1602           0 :         int len;
    1603             : 
    1604           0 :         if (spec.field_width == 0)
    1605           0 :                 return buf;                             /* nothing to print */
    1606             : 
    1607           0 :         if (check_pointer(&buf, end, addr, spec))
    1608           0 :                 return buf;
    1609             : 
    1610           0 :         do {
    1611           0 :                 switch (fmt[count++]) {
    1612           0 :                 case 'a':
    1613           0 :                         flags |= ESCAPE_ANY;
    1614           0 :                         break;
    1615           0 :                 case 'c':
    1616           0 :                         flags |= ESCAPE_SPECIAL;
    1617           0 :                         break;
    1618           0 :                 case 'h':
    1619           0 :                         flags |= ESCAPE_HEX;
    1620           0 :                         break;
    1621           0 :                 case 'n':
    1622           0 :                         flags |= ESCAPE_NULL;
    1623           0 :                         break;
    1624           0 :                 case 'o':
    1625           0 :                         flags |= ESCAPE_OCTAL;
    1626           0 :                         break;
    1627           0 :                 case 'p':
    1628           0 :                         flags |= ESCAPE_NP;
    1629           0 :                         break;
    1630           0 :                 case 's':
    1631           0 :                         flags |= ESCAPE_SPACE;
    1632           0 :                         break;
    1633             :                 default:
    1634             :                         found = false;
    1635             :                         break;
    1636             :                 }
    1637           0 :         } while (found);
    1638             : 
    1639           0 :         if (!flags)
    1640           0 :                 flags = ESCAPE_ANY_NP;
    1641             : 
    1642           0 :         len = spec.field_width < 0 ? 1 : spec.field_width;
    1643             : 
    1644             :         /*
    1645             :          * string_escape_mem() writes as many characters as it can to
    1646             :          * the given buffer, and returns the total size of the output
    1647             :          * had the buffer been big enough.
    1648             :          */
    1649           0 :         buf += string_escape_mem(addr, len, buf, buf < end ? end - buf : 0, flags, NULL);
    1650             : 
    1651           0 :         return buf;
    1652             : }
    1653             : 
    1654          10 : static char *va_format(char *buf, char *end, struct va_format *va_fmt,
    1655             :                        struct printf_spec spec, const char *fmt)
    1656             : {
    1657          10 :         va_list va;
    1658             : 
    1659          10 :         if (check_pointer(&buf, end, va_fmt, spec))
    1660           0 :                 return buf;
    1661             : 
    1662          10 :         va_copy(va, *va_fmt->va);
    1663          10 :         buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va);
    1664          10 :         va_end(va);
    1665             : 
    1666          10 :         return buf;
    1667             : }
    1668             : 
    1669             : static noinline_for_stack
    1670          16 : char *uuid_string(char *buf, char *end, const u8 *addr,
    1671             :                   struct printf_spec spec, const char *fmt)
    1672             : {
    1673          16 :         char uuid[UUID_STRING_LEN + 1];
    1674          16 :         char *p = uuid;
    1675          16 :         int i;
    1676          16 :         const u8 *index = uuid_index;
    1677          16 :         bool uc = false;
    1678             : 
    1679          16 :         if (check_pointer(&buf, end, addr, spec))
    1680           0 :                 return buf;
    1681             : 
    1682          16 :         switch (*(++fmt)) {
    1683           0 :         case 'L':
    1684           0 :                 uc = true;
    1685             :                 fallthrough;
    1686             :         case 'l':
    1687             :                 index = guid_index;
    1688             :                 break;
    1689           0 :         case 'B':
    1690           0 :                 uc = true;
    1691           0 :                 break;
    1692             :         }
    1693             : 
    1694         272 :         for (i = 0; i < 16; i++) {
    1695         256 :                 if (uc)
    1696           0 :                         p = hex_byte_pack_upper(p, addr[index[i]]);
    1697             :                 else
    1698         256 :                         p = hex_byte_pack(p, addr[index[i]]);
    1699         256 :                 switch (i) {
    1700          64 :                 case 3:
    1701             :                 case 5:
    1702             :                 case 7:
    1703             :                 case 9:
    1704          64 :                         *p++ = '-';
    1705          64 :                         break;
    1706             :                 }
    1707         256 :         }
    1708             : 
    1709          16 :         *p = 0;
    1710             : 
    1711          16 :         return string_nocheck(buf, end, uuid, spec);
    1712             : }
    1713             : 
    1714             : static noinline_for_stack
    1715           0 : char *netdev_bits(char *buf, char *end, const void *addr,
    1716             :                   struct printf_spec spec,  const char *fmt)
    1717             : {
    1718           0 :         unsigned long long num;
    1719           0 :         int size;
    1720             : 
    1721           0 :         if (check_pointer(&buf, end, addr, spec))
    1722           0 :                 return buf;
    1723             : 
    1724           0 :         switch (fmt[1]) {
    1725           0 :         case 'F':
    1726           0 :                 num = *(const netdev_features_t *)addr;
    1727           0 :                 size = sizeof(netdev_features_t);
    1728           0 :                 break;
    1729           0 :         default:
    1730           0 :                 return error_string(buf, end, "(%pN?)", spec);
    1731             :         }
    1732             : 
    1733           0 :         return special_hex_number(buf, end, num, size);
    1734             : }
    1735             : 
    1736             : static noinline_for_stack
    1737           0 : char *address_val(char *buf, char *end, const void *addr,
    1738             :                   struct printf_spec spec, const char *fmt)
    1739             : {
    1740           0 :         unsigned long long num;
    1741           0 :         int size;
    1742             : 
    1743           0 :         if (check_pointer(&buf, end, addr, spec))
    1744           0 :                 return buf;
    1745             : 
    1746           0 :         switch (fmt[1]) {
    1747           0 :         case 'd':
    1748           0 :                 num = *(const dma_addr_t *)addr;
    1749           0 :                 size = sizeof(dma_addr_t);
    1750           0 :                 break;
    1751           0 :         case 'p':
    1752             :         default:
    1753           0 :                 num = *(const phys_addr_t *)addr;
    1754           0 :                 size = sizeof(phys_addr_t);
    1755           0 :                 break;
    1756             :         }
    1757             : 
    1758           0 :         return special_hex_number(buf, end, num, size);
    1759             : }
    1760             : 
    1761             : static noinline_for_stack
    1762           0 : char *date_str(char *buf, char *end, const struct rtc_time *tm, bool r)
    1763             : {
    1764           0 :         int year = tm->tm_year + (r ? 0 : 1900);
    1765           0 :         int mon = tm->tm_mon + (r ? 0 : 1);
    1766             : 
    1767           0 :         buf = number(buf, end, year, default_dec04_spec);
    1768           0 :         if (buf < end)
    1769           0 :                 *buf = '-';
    1770           0 :         buf++;
    1771             : 
    1772           0 :         buf = number(buf, end, mon, default_dec02_spec);
    1773           0 :         if (buf < end)
    1774           0 :                 *buf = '-';
    1775           0 :         buf++;
    1776             : 
    1777           0 :         return number(buf, end, tm->tm_mday, default_dec02_spec);
    1778             : }
    1779             : 
    1780             : static noinline_for_stack
    1781           0 : char *time_str(char *buf, char *end, const struct rtc_time *tm, bool r)
    1782             : {
    1783           0 :         buf = number(buf, end, tm->tm_hour, default_dec02_spec);
    1784           0 :         if (buf < end)
    1785           0 :                 *buf = ':';
    1786           0 :         buf++;
    1787             : 
    1788           0 :         buf = number(buf, end, tm->tm_min, default_dec02_spec);
    1789           0 :         if (buf < end)
    1790           0 :                 *buf = ':';
    1791           0 :         buf++;
    1792             : 
    1793           0 :         return number(buf, end, tm->tm_sec, default_dec02_spec);
    1794             : }
    1795             : 
    1796             : static noinline_for_stack
    1797           0 : char *rtc_str(char *buf, char *end, const struct rtc_time *tm,
    1798             :               struct printf_spec spec, const char *fmt)
    1799             : {
    1800           0 :         bool have_t = true, have_d = true;
    1801           0 :         bool raw = false;
    1802           0 :         int count = 2;
    1803             : 
    1804           0 :         if (check_pointer(&buf, end, tm, spec))
    1805           0 :                 return buf;
    1806             : 
    1807           0 :         switch (fmt[count]) {
    1808           0 :         case 'd':
    1809           0 :                 have_t = false;
    1810           0 :                 count++;
    1811           0 :                 break;
    1812           0 :         case 't':
    1813           0 :                 have_d = false;
    1814           0 :                 count++;
    1815           0 :                 break;
    1816             :         }
    1817             : 
    1818           0 :         raw = fmt[count] == 'r';
    1819             : 
    1820           0 :         if (have_d)
    1821           0 :                 buf = date_str(buf, end, tm, raw);
    1822           0 :         if (have_d && have_t) {
    1823             :                 /* Respect ISO 8601 */
    1824           0 :                 if (buf < end)
    1825           0 :                         *buf = 'T';
    1826           0 :                 buf++;
    1827             :         }
    1828           0 :         if (have_t)
    1829           0 :                 buf = time_str(buf, end, tm, raw);
    1830             : 
    1831           0 :         return buf;
    1832             : }
    1833             : 
    1834             : static noinline_for_stack
    1835           0 : char *time64_str(char *buf, char *end, const time64_t time,
    1836             :                  struct printf_spec spec, const char *fmt)
    1837             : {
    1838           0 :         struct rtc_time rtc_time;
    1839           0 :         struct tm tm;
    1840             : 
    1841           0 :         time64_to_tm(time, 0, &tm);
    1842             : 
    1843           0 :         rtc_time.tm_sec = tm.tm_sec;
    1844           0 :         rtc_time.tm_min = tm.tm_min;
    1845           0 :         rtc_time.tm_hour = tm.tm_hour;
    1846           0 :         rtc_time.tm_mday = tm.tm_mday;
    1847           0 :         rtc_time.tm_mon = tm.tm_mon;
    1848           0 :         rtc_time.tm_year = tm.tm_year;
    1849           0 :         rtc_time.tm_wday = tm.tm_wday;
    1850           0 :         rtc_time.tm_yday = tm.tm_yday;
    1851             : 
    1852           0 :         rtc_time.tm_isdst = 0;
    1853             : 
    1854           0 :         return rtc_str(buf, end, &rtc_time, spec, fmt);
    1855             : }
    1856             : 
    1857             : static noinline_for_stack
    1858           0 : char *time_and_date(char *buf, char *end, void *ptr, struct printf_spec spec,
    1859             :                     const char *fmt)
    1860             : {
    1861           0 :         switch (fmt[1]) {
    1862           0 :         case 'R':
    1863           0 :                 return rtc_str(buf, end, (const struct rtc_time *)ptr, spec, fmt);
    1864           0 :         case 'T':
    1865           0 :                 return time64_str(buf, end, *(const time64_t *)ptr, spec, fmt);
    1866           0 :         default:
    1867           0 :                 return error_string(buf, end, "(%pt?)", spec);
    1868             :         }
    1869             : }
    1870             : 
    1871             : static noinline_for_stack
    1872           0 : char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
    1873             :             const char *fmt)
    1874             : {
    1875           0 :         if (!IS_ENABLED(CONFIG_HAVE_CLK))
    1876           0 :                 return error_string(buf, end, "(%pC?)", spec);
    1877             : 
    1878             :         if (check_pointer(&buf, end, clk, spec))
    1879             :                 return buf;
    1880             : 
    1881             :         switch (fmt[1]) {
    1882             :         case 'n':
    1883             :         default:
    1884             : #ifdef CONFIG_COMMON_CLK
    1885             :                 return string(buf, end, __clk_get_name(clk), spec);
    1886             : #else
    1887             :                 return ptr_to_id(buf, end, clk, spec);
    1888             : #endif
    1889             :         }
    1890             : }
    1891             : 
    1892             : static
    1893           0 : char *format_flags(char *buf, char *end, unsigned long flags,
    1894             :                                         const struct trace_print_flags *names)
    1895             : {
    1896           0 :         unsigned long mask;
    1897             : 
    1898           0 :         for ( ; flags && names->name; names++) {
    1899           0 :                 mask = names->mask;
    1900           0 :                 if ((flags & mask) != mask)
    1901           0 :                         continue;
    1902             : 
    1903           0 :                 buf = string(buf, end, names->name, default_str_spec);
    1904             : 
    1905           0 :                 flags &= ~mask;
    1906           0 :                 if (flags) {
    1907           0 :                         if (buf < end)
    1908           0 :                                 *buf = '|';
    1909           0 :                         buf++;
    1910             :                 }
    1911             :         }
    1912             : 
    1913           0 :         if (flags)
    1914           0 :                 buf = number(buf, end, flags, default_flag_spec);
    1915             : 
    1916           0 :         return buf;
    1917             : }
    1918             : 
    1919             : static noinline_for_stack
    1920           0 : char *flags_string(char *buf, char *end, void *flags_ptr,
    1921             :                    struct printf_spec spec, const char *fmt)
    1922             : {
    1923           0 :         unsigned long flags;
    1924           0 :         const struct trace_print_flags *names;
    1925             : 
    1926           0 :         if (check_pointer(&buf, end, flags_ptr, spec))
    1927           0 :                 return buf;
    1928             : 
    1929           0 :         switch (fmt[1]) {
    1930           0 :         case 'p':
    1931           0 :                 flags = *(unsigned long *)flags_ptr;
    1932             :                 /* Remove zone id */
    1933           0 :                 flags &= (1UL << NR_PAGEFLAGS) - 1;
    1934           0 :                 names = pageflag_names;
    1935           0 :                 break;
    1936           0 :         case 'v':
    1937           0 :                 flags = *(unsigned long *)flags_ptr;
    1938           0 :                 names = vmaflag_names;
    1939           0 :                 break;
    1940           0 :         case 'g':
    1941           0 :                 flags = (__force unsigned long)(*(gfp_t *)flags_ptr);
    1942           0 :                 names = gfpflag_names;
    1943           0 :                 break;
    1944           0 :         default:
    1945           0 :                 return error_string(buf, end, "(%pG?)", spec);
    1946             :         }
    1947             : 
    1948           0 :         return format_flags(buf, end, flags, names);
    1949             : }
    1950             : 
    1951             : static noinline_for_stack
    1952           0 : char *fwnode_full_name_string(struct fwnode_handle *fwnode, char *buf,
    1953             :                               char *end)
    1954             : {
    1955           0 :         int depth;
    1956             : 
    1957             :         /* Loop starting from the root node to the current node. */
    1958           0 :         for (depth = fwnode_count_parents(fwnode); depth >= 0; depth--) {
    1959           0 :                 struct fwnode_handle *__fwnode =
    1960           0 :                         fwnode_get_nth_parent(fwnode, depth);
    1961             : 
    1962           0 :                 buf = string(buf, end, fwnode_get_name_prefix(__fwnode),
    1963             :                              default_str_spec);
    1964           0 :                 buf = string(buf, end, fwnode_get_name(__fwnode),
    1965             :                              default_str_spec);
    1966             : 
    1967           0 :                 fwnode_handle_put(__fwnode);
    1968             :         }
    1969             : 
    1970           0 :         return buf;
    1971             : }
    1972             : 
    1973             : static noinline_for_stack
    1974           0 : char *device_node_string(char *buf, char *end, struct device_node *dn,
    1975             :                          struct printf_spec spec, const char *fmt)
    1976             : {
    1977           0 :         char tbuf[sizeof("xxxx") + 1];
    1978           0 :         const char *p;
    1979           0 :         int ret;
    1980           0 :         char *buf_start = buf;
    1981           0 :         struct property *prop;
    1982           0 :         bool has_mult, pass;
    1983             : 
    1984           0 :         struct printf_spec str_spec = spec;
    1985           0 :         str_spec.field_width = -1;
    1986             : 
    1987           0 :         if (fmt[0] != 'F')
    1988           0 :                 return error_string(buf, end, "(%pO?)", spec);
    1989             : 
    1990           0 :         if (!IS_ENABLED(CONFIG_OF))
    1991           0 :                 return error_string(buf, end, "(%pOF?)", spec);
    1992             : 
    1993             :         if (check_pointer(&buf, end, dn, spec))
    1994             :                 return buf;
    1995             : 
    1996             :         /* simple case without anything any more format specifiers */
    1997             :         fmt++;
    1998             :         if (fmt[0] == '\0' || strcspn(fmt,"fnpPFcC") > 0)
    1999             :                 fmt = "f";
    2000             : 
    2001             :         for (pass = false; strspn(fmt,"fnpPFcC"); fmt++, pass = true) {
    2002             :                 int precision;
    2003             :                 if (pass) {
    2004             :                         if (buf < end)
    2005             :                                 *buf = ':';
    2006             :                         buf++;
    2007             :                 }
    2008             : 
    2009             :                 switch (*fmt) {
    2010             :                 case 'f':       /* full_name */
    2011             :                         buf = fwnode_full_name_string(of_fwnode_handle(dn), buf,
    2012             :                                                       end);
    2013             :                         break;
    2014             :                 case 'n':       /* name */
    2015             :                         p = fwnode_get_name(of_fwnode_handle(dn));
    2016             :                         precision = str_spec.precision;
    2017             :                         str_spec.precision = strchrnul(p, '@') - p;
    2018             :                         buf = string(buf, end, p, str_spec);
    2019             :                         str_spec.precision = precision;
    2020             :                         break;
    2021             :                 case 'p':       /* phandle */
    2022             :                         buf = number(buf, end, (unsigned int)dn->phandle, default_dec_spec);
    2023             :                         break;
    2024             :                 case 'P':       /* path-spec */
    2025             :                         p = fwnode_get_name(of_fwnode_handle(dn));
    2026             :                         if (!p[1])
    2027             :                                 p = "/";
    2028             :                         buf = string(buf, end, p, str_spec);
    2029             :                         break;
    2030             :                 case 'F':       /* flags */
    2031             :                         tbuf[0] = of_node_check_flag(dn, OF_DYNAMIC) ? 'D' : '-';
    2032             :                         tbuf[1] = of_node_check_flag(dn, OF_DETACHED) ? 'd' : '-';
    2033             :                         tbuf[2] = of_node_check_flag(dn, OF_POPULATED) ? 'P' : '-';
    2034             :                         tbuf[3] = of_node_check_flag(dn, OF_POPULATED_BUS) ? 'B' : '-';
    2035             :                         tbuf[4] = 0;
    2036             :                         buf = string_nocheck(buf, end, tbuf, str_spec);
    2037             :                         break;
    2038             :                 case 'c':       /* major compatible string */
    2039             :                         ret = of_property_read_string(dn, "compatible", &p);
    2040             :                         if (!ret)
    2041             :                                 buf = string(buf, end, p, str_spec);
    2042             :                         break;
    2043             :                 case 'C':       /* full compatible string */
    2044             :                         has_mult = false;
    2045             :                         of_property_for_each_string(dn, "compatible", prop, p) {
    2046             :                                 if (has_mult)
    2047             :                                         buf = string_nocheck(buf, end, ",", str_spec);
    2048             :                                 buf = string_nocheck(buf, end, "\"", str_spec);
    2049             :                                 buf = string(buf, end, p, str_spec);
    2050             :                                 buf = string_nocheck(buf, end, "\"", str_spec);
    2051             : 
    2052             :                                 has_mult = true;
    2053             :                         }
    2054             :                         break;
    2055             :                 default:
    2056             :                         break;
    2057             :                 }
    2058             :         }
    2059             : 
    2060             :         return widen_string(buf, buf - buf_start, end, spec);
    2061             : }
    2062             : 
    2063             : static noinline_for_stack
    2064           0 : char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
    2065             :                     struct printf_spec spec, const char *fmt)
    2066             : {
    2067           0 :         struct printf_spec str_spec = spec;
    2068           0 :         char *buf_start = buf;
    2069             : 
    2070           0 :         str_spec.field_width = -1;
    2071             : 
    2072           0 :         if (*fmt != 'w')
    2073           0 :                 return error_string(buf, end, "(%pf?)", spec);
    2074             : 
    2075           0 :         if (check_pointer(&buf, end, fwnode, spec))
    2076           0 :                 return buf;
    2077             : 
    2078           0 :         fmt++;
    2079             : 
    2080           0 :         switch (*fmt) {
    2081           0 :         case 'P':       /* name */
    2082           0 :                 buf = string(buf, end, fwnode_get_name(fwnode), str_spec);
    2083           0 :                 break;
    2084           0 :         case 'f':       /* full_name */
    2085             :         default:
    2086           0 :                 buf = fwnode_full_name_string(fwnode, buf, end);
    2087           0 :                 break;
    2088             :         }
    2089             : 
    2090           0 :         return widen_string(buf, buf - buf_start, end, spec);
    2091             : }
    2092             : 
    2093             : /* Disable pointer hashing if requested */
    2094             : bool no_hash_pointers __ro_after_init;
    2095             : EXPORT_SYMBOL_GPL(no_hash_pointers);
    2096             : 
    2097           0 : static int __init no_hash_pointers_enable(char *str)
    2098             : {
    2099           0 :         no_hash_pointers = true;
    2100             : 
    2101           0 :         pr_warn("**********************************************************\n");
    2102           0 :         pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n");
    2103           0 :         pr_warn("**                                                      **\n");
    2104           0 :         pr_warn("** This system shows unhashed kernel memory addresses   **\n");
    2105           0 :         pr_warn("** via the console, logs, and other interfaces. This    **\n");
    2106           0 :         pr_warn("** might reduce the security of your system.            **\n");
    2107           0 :         pr_warn("**                                                      **\n");
    2108           0 :         pr_warn("** If you see this message and you are not debugging    **\n");
    2109           0 :         pr_warn("** the kernel, report this immediately to your system   **\n");
    2110           0 :         pr_warn("** administrator!                                       **\n");
    2111           0 :         pr_warn("**                                                      **\n");
    2112           0 :         pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n");
    2113           0 :         pr_warn("**********************************************************\n");
    2114             : 
    2115           0 :         return 0;
    2116             : }
    2117             : early_param("no_hash_pointers", no_hash_pointers_enable);
    2118             : 
    2119             : /*
    2120             :  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
    2121             :  * by an extra set of alphanumeric characters that are extended format
    2122             :  * specifiers.
    2123             :  *
    2124             :  * Please update scripts/checkpatch.pl when adding/removing conversion
    2125             :  * characters.  (Search for "check for vsprintf extension").
    2126             :  *
    2127             :  * Right now we handle:
    2128             :  *
    2129             :  * - 'S' For symbolic direct pointers (or function descriptors) with offset
    2130             :  * - 's' For symbolic direct pointers (or function descriptors) without offset
    2131             :  * - '[Ss]R' as above with __builtin_extract_return_addr() translation
    2132             :  * - '[Ff]' %pf and %pF were obsoleted and later removed in favor of
    2133             :  *          %ps and %pS. Be careful when re-using these specifiers.
    2134             :  * - 'B' For backtraced symbolic direct pointers with offset
    2135             :  * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
    2136             :  * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]
    2137             :  * - 'b[l]' For a bitmap, the number of bits is determined by the field
    2138             :  *       width which must be explicitly specified either as part of the
    2139             :  *       format string '%32b[l]' or through '%*b[l]', [l] selects
    2140             :  *       range-list format instead of hex format
    2141             :  * - 'M' For a 6-byte MAC address, it prints the address in the
    2142             :  *       usual colon-separated hex notation
    2143             :  * - 'm' For a 6-byte MAC address, it prints the hex address without colons
    2144             :  * - 'MF' For a 6-byte MAC FDDI address, it prints the address
    2145             :  *       with a dash-separated hex notation
    2146             :  * - '[mM]R' For a 6-byte MAC address, Reverse order (Bluetooth)
    2147             :  * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way
    2148             :  *       IPv4 uses dot-separated decimal without leading 0's (1.2.3.4)
    2149             :  *       IPv6 uses colon separated network-order 16 bit hex with leading 0's
    2150             :  *       [S][pfs]
    2151             :  *       Generic IPv4/IPv6 address (struct sockaddr *) that falls back to
    2152             :  *       [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
    2153             :  * - 'i' [46] for 'raw' IPv4/IPv6 addresses
    2154             :  *       IPv6 omits the colons (01020304...0f)
    2155             :  *       IPv4 uses dot-separated decimal with leading 0's (010.123.045.006)
    2156             :  *       [S][pfs]
    2157             :  *       Generic IPv4/IPv6 address (struct sockaddr *) that falls back to
    2158             :  *       [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
    2159             :  * - '[Ii][4S][hnbl]' IPv4 addresses in host, network, big or little endian order
    2160             :  * - 'I[6S]c' for IPv6 addresses printed as specified by
    2161             :  *       https://tools.ietf.org/html/rfc5952
    2162             :  * - 'E[achnops]' For an escaped buffer, where rules are defined by combination
    2163             :  *                of the following flags (see string_escape_mem() for the
    2164             :  *                details):
    2165             :  *                  a - ESCAPE_ANY
    2166             :  *                  c - ESCAPE_SPECIAL
    2167             :  *                  h - ESCAPE_HEX
    2168             :  *                  n - ESCAPE_NULL
    2169             :  *                  o - ESCAPE_OCTAL
    2170             :  *                  p - ESCAPE_NP
    2171             :  *                  s - ESCAPE_SPACE
    2172             :  *                By default ESCAPE_ANY_NP is used.
    2173             :  * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form
    2174             :  *       "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    2175             :  *       Options for %pU are:
    2176             :  *         b big endian lower case hex (default)
    2177             :  *         B big endian UPPER case hex
    2178             :  *         l little endian lower case hex
    2179             :  *         L little endian UPPER case hex
    2180             :  *           big endian output byte order is:
    2181             :  *             [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
    2182             :  *           little endian output byte order is:
    2183             :  *             [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
    2184             :  * - 'V' For a struct va_format which contains a format string * and va_list *,
    2185             :  *       call vsnprintf(->format, *->va_list).
    2186             :  *       Implements a "recursive vsnprintf".
    2187             :  *       Do not use this feature without some mechanism to verify the
    2188             :  *       correctness of the format string and va_list arguments.
    2189             :  * - 'K' For a kernel pointer that should be hidden from unprivileged users
    2190             :  * - 'NF' For a netdev_features_t
    2191             :  * - 'h[CDN]' For a variable-length buffer, it prints it as a hex string with
    2192             :  *            a certain separator (' ' by default):
    2193             :  *              C colon
    2194             :  *              D dash
    2195             :  *              N no separator
    2196             :  *            The maximum supported length is 64 bytes of the input. Consider
    2197             :  *            to use print_hex_dump() for the larger input.
    2198             :  * - 'a[pd]' For address types [p] phys_addr_t, [d] dma_addr_t and derivatives
    2199             :  *           (default assumed to be phys_addr_t, passed by reference)
    2200             :  * - 'd[234]' For a dentry name (optionally 2-4 last components)
    2201             :  * - 'D[234]' Same as 'd' but for a struct file
    2202             :  * - 'g' For block_device name (gendisk + partition number)
    2203             :  * - 't[RT][dt][r]' For time and date as represented by:
    2204             :  *      R    struct rtc_time
    2205             :  *      T    time64_t
    2206             :  * - 'C' For a clock, it prints the name (Common Clock Framework) or address
    2207             :  *       (legacy clock framework) of the clock
    2208             :  * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address
    2209             :  *        (legacy clock framework) of the clock
    2210             :  * - 'G' For flags to be printed as a collection of symbolic strings that would
    2211             :  *       construct the specific value. Supported flags given by option:
    2212             :  *       p page flags (see struct page) given as pointer to unsigned long
    2213             :  *       g gfp flags (GFP_* and __GFP_*) given as pointer to gfp_t
    2214             :  *       v vma flags (VM_*) given as pointer to unsigned long
    2215             :  * - 'OF[fnpPcCF]'  For a device tree object
    2216             :  *                  Without any optional arguments prints the full_name
    2217             :  *                  f device node full_name
    2218             :  *                  n device node name
    2219             :  *                  p device node phandle
    2220             :  *                  P device node path spec (name + @unit)
    2221             :  *                  F device node flags
    2222             :  *                  c major compatible string
    2223             :  *                  C full compatible string
    2224             :  * - 'fw[fP]'   For a firmware node (struct fwnode_handle) pointer
    2225             :  *              Without an option prints the full name of the node
    2226             :  *              f full name
    2227             :  *              P node name, including a possible unit address
    2228             :  * - 'x' For printing the address. Equivalent to "%lx".
    2229             :  * - '[ku]s' For a BPF/tracing related format specifier, e.g. used out of
    2230             :  *           bpf_trace_printk() where [ku] prefix specifies either kernel (k)
    2231             :  *           or user (u) memory to probe, and:
    2232             :  *              s a string, equivalent to "%s" on direct vsnprintf() use
    2233             :  *
    2234             :  * ** When making changes please also update:
    2235             :  *      Documentation/core-api/printk-formats.rst
    2236             :  *
    2237             :  * Note: The default behaviour (unadorned %p) is to hash the address,
    2238             :  * rendering it useful as a unique identifier.
    2239             :  */
    2240             : static noinline_for_stack
    2241         240 : char *pointer(const char *fmt, char *buf, char *end, void *ptr,
    2242             :               struct printf_spec spec)
    2243             : {
    2244         240 :         switch (*fmt) {
    2245             :         case 'S':
    2246             :         case 's':
    2247          82 :                 ptr = dereference_symbol_descriptor(ptr);
    2248          82 :                 fallthrough;
    2249          82 :         case 'B':
    2250          82 :                 return symbol_string(buf, end, ptr, spec, fmt);
    2251           0 :         case 'R':
    2252             :         case 'r':
    2253           0 :                 return resource_string(buf, end, ptr, spec, fmt);
    2254          10 :         case 'h':
    2255          10 :                 return hex_string(buf, end, ptr, spec, fmt);
    2256         112 :         case 'b':
    2257         112 :                 switch (fmt[1]) {
    2258          56 :                 case 'l':
    2259          56 :                         return bitmap_list_string(buf, end, ptr, spec, fmt);
    2260          56 :                 default:
    2261          56 :                         return bitmap_string(buf, end, ptr, spec, fmt);
    2262             :                 }
    2263           0 :         case 'M':                       /* Colon separated: 00:01:02:03:04:05 */
    2264             :         case 'm':                       /* Contiguous: 000102030405 */
    2265             :                                         /* [mM]F (FDDI) */
    2266             :                                         /* [mM]R (Reverse order; Bluetooth) */
    2267           0 :                 return mac_address_string(buf, end, ptr, spec, fmt);
    2268           0 :         case 'I':                       /* Formatted IP supported
    2269             :                                          * 4:   1.2.3.4
    2270             :                                          * 6:   0001:0203:...:0708
    2271             :                                          * 6c:  1::708 or 1::1.2.3.4
    2272             :                                          */
    2273             :         case 'i':                       /* Contiguous:
    2274             :                                          * 4:   001.002.003.004
    2275             :                                          * 6:   000102...0f
    2276             :                                          */
    2277           0 :                 return ip_addr_string(buf, end, ptr, spec, fmt);
    2278           0 :         case 'E':
    2279           0 :                 return escaped_string(buf, end, ptr, spec, fmt);
    2280          16 :         case 'U':
    2281          16 :                 return uuid_string(buf, end, ptr, spec, fmt);
    2282          10 :         case 'V':
    2283          10 :                 return va_format(buf, end, ptr, spec, fmt);
    2284           0 :         case 'K':
    2285           0 :                 return restricted_pointer(buf, end, ptr, spec);
    2286           0 :         case 'N':
    2287           0 :                 return netdev_bits(buf, end, ptr, spec, fmt);
    2288           0 :         case 'a':
    2289           0 :                 return address_val(buf, end, ptr, spec, fmt);
    2290           0 :         case 'd':
    2291           0 :                 return dentry_name(buf, end, ptr, spec, fmt);
    2292           0 :         case 't':
    2293           0 :                 return time_and_date(buf, end, ptr, spec, fmt);
    2294           0 :         case 'C':
    2295           0 :                 return clock(buf, end, ptr, spec, fmt);
    2296           0 :         case 'D':
    2297           0 :                 return file_dentry_name(buf, end, ptr, spec, fmt);
    2298             : #ifdef CONFIG_BLOCK
    2299           2 :         case 'g':
    2300           2 :                 return bdev_name(buf, end, ptr, spec, fmt);
    2301             : #endif
    2302             : 
    2303           0 :         case 'G':
    2304           0 :                 return flags_string(buf, end, ptr, spec, fmt);
    2305           0 :         case 'O':
    2306           0 :                 return device_node_string(buf, end, ptr, spec, fmt + 1);
    2307           0 :         case 'f':
    2308           0 :                 return fwnode_string(buf, end, ptr, spec, fmt + 1);
    2309           8 :         case 'x':
    2310           8 :                 return pointer_string(buf, end, ptr, spec);
    2311             :         case 'e':
    2312             :                 /* %pe with a non-ERR_PTR gets treated as plain %p */
    2313           0 :                 if (!IS_ERR(ptr))
    2314             :                         break;
    2315           0 :                 return err_ptr(buf, end, ptr, spec);
    2316           0 :         case 'u':
    2317             :         case 'k':
    2318           0 :                 switch (fmt[1]) {
    2319           0 :                 case 's':
    2320           0 :                         return string(buf, end, ptr, spec);
    2321           0 :                 default:
    2322           0 :                         return error_string(buf, end, "(einval)", spec);
    2323             :                 }
    2324             :         }
    2325             : 
    2326             :         /*
    2327             :          * default is to _not_ leak addresses, so hash before printing,
    2328             :          * unless no_hash_pointers is specified on the command line.
    2329             :          */
    2330           0 :         if (unlikely(no_hash_pointers))
    2331           0 :                 return pointer_string(buf, end, ptr, spec);
    2332             :         else
    2333           0 :                 return ptr_to_id(buf, end, ptr, spec);
    2334             : }
    2335             : 
    2336             : /*
    2337             :  * Helper function to decode printf style format.
    2338             :  * Each call decode a token from the format and return the
    2339             :  * number of characters read (or likely the delta where it wants
    2340             :  * to go on the next call).
    2341             :  * The decoded token is returned through the parameters
    2342             :  *
    2343             :  * 'h', 'l', or 'L' for integer fields
    2344             :  * 'z' support added 23/7/1999 S.H.
    2345             :  * 'z' changed to 'Z' --davidm 1/25/99
    2346             :  * 'Z' changed to 'z' --adobriyan 2017-01-25
    2347             :  * 't' added for ptrdiff_t
    2348             :  *
    2349             :  * @fmt: the format string
    2350             :  * @type of the token returned
    2351             :  * @flags: various flags such as +, -, # tokens..
    2352             :  * @field_width: overwritten width
    2353             :  * @base: base of the number (octal, hex, ...)
    2354             :  * @precision: precision of a number
    2355             :  * @qualifier: qualifier of a number (long, size_t, ...)
    2356             :  */
    2357             : static noinline_for_stack
    2358      114409 : int format_decode(const char *fmt, struct printf_spec *spec)
    2359             : {
    2360      114409 :         const char *start = fmt;
    2361      114409 :         char qualifier;
    2362             : 
    2363             :         /* we finished early by reading the field width */
    2364      114409 :         if (spec->type == FORMAT_TYPE_WIDTH) {
    2365         133 :                 if (spec->field_width < 0) {
    2366           0 :                         spec->field_width = -spec->field_width;
    2367           0 :                         spec->flags |= LEFT;
    2368             :                 }
    2369         133 :                 spec->type = FORMAT_TYPE_NONE;
    2370         133 :                 goto precision;
    2371             :         }
    2372             : 
    2373             :         /* we finished early by reading the precision */
    2374      114276 :         if (spec->type == FORMAT_TYPE_PRECISION) {
    2375           4 :                 if (spec->precision < 0)
    2376           0 :                         spec->precision = 0;
    2377             : 
    2378           4 :                 spec->type = FORMAT_TYPE_NONE;
    2379           4 :                 goto qualifier;
    2380             :         }
    2381             : 
    2382             :         /* By default */
    2383      114272 :         spec->type = FORMAT_TYPE_NONE;
    2384             : 
    2385      277874 :         for (; *fmt ; ++fmt) {
    2386      263073 :                 if (*fmt == '%')
    2387             :                         break;
    2388             :         }
    2389             : 
    2390             :         /* Return the current non-format string */
    2391      114272 :         if (fmt != start || !*fmt)
    2392       53879 :                 return fmt - start;
    2393             : 
    2394             :         /* Process flags */
    2395       60393 :         spec->flags = 0;
    2396             : 
    2397       64704 :         while (1) { /* this also skips first '%' */
    2398       64704 :                 bool found = true;
    2399             : 
    2400       64704 :                 ++fmt;
    2401             : 
    2402       64704 :                 switch (*fmt) {
    2403         314 :                 case '-': spec->flags |= LEFT;    break;
    2404           0 :                 case '+': spec->flags |= PLUS;    break;
    2405           0 :                 case ' ': spec->flags |= SPACE;   break;
    2406         315 :                 case '#': spec->flags |= SPECIAL; break;
    2407        3682 :                 case '0': spec->flags |= ZEROPAD; break;
    2408             :                 default:  found = false;
    2409             :                 }
    2410             : 
    2411        4311 :                 if (!found)
    2412             :                         break;
    2413             :         }
    2414             : 
    2415             :         /* get field width */
    2416       60393 :         spec->field_width = -1;
    2417             : 
    2418       60393 :         if (isdigit(*fmt))
    2419        4045 :                 spec->field_width = skip_atoi(&fmt);
    2420       56348 :         else if (*fmt == '*') {
    2421             :                 /* it's the next argument */
    2422         134 :                 spec->type = FORMAT_TYPE_WIDTH;
    2423         134 :                 return ++fmt - start;
    2424             :         }
    2425             : 
    2426       56214 : precision:
    2427             :         /* get the precision */
    2428       60392 :         spec->precision = -1;
    2429       60392 :         if (*fmt == '.') {
    2430           6 :                 ++fmt;
    2431           6 :                 if (isdigit(*fmt)) {
    2432           2 :                         spec->precision = skip_atoi(&fmt);
    2433           2 :                         if (spec->precision < 0)
    2434           0 :                                 spec->precision = 0;
    2435           4 :                 } else if (*fmt == '*') {
    2436             :                         /* it's the next argument */
    2437           4 :                         spec->type = FORMAT_TYPE_PRECISION;
    2438           4 :                         return ++fmt - start;
    2439             :                 }
    2440             :         }
    2441             : 
    2442       60386 : qualifier:
    2443             :         /* get the conversion qualifier */
    2444       60392 :         qualifier = 0;
    2445       60392 :         if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
    2446       55331 :             *fmt == 'z' || *fmt == 't') {
    2447        5061 :                 qualifier = *fmt++;
    2448        5061 :                 if (unlikely(qualifier == *fmt)) {
    2449        1241 :                         if (qualifier == 'l') {
    2450        1241 :                                 qualifier = 'L';
    2451        1241 :                                 ++fmt;
    2452           0 :                         } else if (qualifier == 'h') {
    2453           0 :                                 qualifier = 'H';
    2454           0 :                                 ++fmt;
    2455             :                         }
    2456             :                 }
    2457             :         }
    2458             : 
    2459             :         /* default base */
    2460       60392 :         spec->base = 10;
    2461       60392 :         switch (*fmt) {
    2462         874 :         case 'c':
    2463         874 :                 spec->type = FORMAT_TYPE_CHAR;
    2464         874 :                 return ++fmt - start;
    2465             : 
    2466       19345 :         case 's':
    2467       19345 :                 spec->type = FORMAT_TYPE_STR;
    2468       19345 :                 return ++fmt - start;
    2469             : 
    2470         240 :         case 'p':
    2471         240 :                 spec->type = FORMAT_TYPE_PTR;
    2472         240 :                 return ++fmt - start;
    2473             : 
    2474           0 :         case '%':
    2475           0 :                 spec->type = FORMAT_TYPE_PERCENT_CHAR;
    2476           0 :                 return ++fmt - start;
    2477             : 
    2478             :         /* integer number formats - set up the flags and "break" */
    2479        2146 :         case 'o':
    2480        2146 :                 spec->base = 8;
    2481        2146 :                 break;
    2482             : 
    2483         424 :         case 'x':
    2484         424 :                 spec->flags |= SMALL;
    2485        1924 :                 fallthrough;
    2486             : 
    2487        1924 :         case 'X':
    2488        1924 :                 spec->base = 16;
    2489        1924 :                 break;
    2490             : 
    2491       17308 :         case 'd':
    2492             :         case 'i':
    2493       17308 :                 spec->flags |= SIGN;
    2494       17308 :                 break;
    2495             :         case 'u':
    2496             :                 break;
    2497             : 
    2498             :         case 'n':
    2499             :                 /*
    2500             :                  * Since %n poses a greater security risk than
    2501             :                  * utility, treat it as any other invalid or
    2502             :                  * unsupported format specifier.
    2503             :                  */
    2504           0 :                 fallthrough;
    2505             : 
    2506             :         default:
    2507           0 :                 WARN_ONCE(1, "Please remove unsupported %%%c in format string\n", *fmt);
    2508           0 :                 spec->type = FORMAT_TYPE_INVALID;
    2509           0 :                 return fmt - start;
    2510             :         }
    2511             : 
    2512       39933 :         if (qualifier == 'L')
    2513        1309 :                 spec->type = FORMAT_TYPE_LONG_LONG;
    2514       38624 :         else if (qualifier == 'l') {
    2515        2371 :                 BUILD_BUG_ON(FORMAT_TYPE_ULONG + SIGN != FORMAT_TYPE_LONG);
    2516        2371 :                 spec->type = FORMAT_TYPE_ULONG + (spec->flags & SIGN);
    2517       36253 :         } else if (qualifier == 'z') {
    2518          28 :                 spec->type = FORMAT_TYPE_SIZE_T;
    2519       36225 :         } else if (qualifier == 't') {
    2520           0 :                 spec->type = FORMAT_TYPE_PTRDIFF;
    2521       36225 :         } else if (qualifier == 'H') {
    2522           0 :                 BUILD_BUG_ON(FORMAT_TYPE_UBYTE + SIGN != FORMAT_TYPE_BYTE);
    2523           0 :                 spec->type = FORMAT_TYPE_UBYTE + (spec->flags & SIGN);
    2524       36225 :         } else if (qualifier == 'h') {
    2525        1353 :                 BUILD_BUG_ON(FORMAT_TYPE_USHORT + SIGN != FORMAT_TYPE_SHORT);
    2526        1353 :                 spec->type = FORMAT_TYPE_USHORT + (spec->flags & SIGN);
    2527             :         } else {
    2528       34872 :                 BUILD_BUG_ON(FORMAT_TYPE_UINT + SIGN != FORMAT_TYPE_INT);
    2529       34872 :                 spec->type = FORMAT_TYPE_UINT + (spec->flags & SIGN);
    2530             :         }
    2531             : 
    2532       39933 :         return ++fmt - start;
    2533             : }
    2534             : 
    2535             : static void
    2536         134 : set_field_width(struct printf_spec *spec, int width)
    2537             : {
    2538         134 :         spec->field_width = width;
    2539         134 :         if (WARN_ONCE(spec->field_width != width, "field width %d too large", width)) {
    2540           0 :                 spec->field_width = clamp(width, -FIELD_WIDTH_MAX, FIELD_WIDTH_MAX);
    2541             :         }
    2542         134 : }
    2543             : 
    2544             : static void
    2545           4 : set_precision(struct printf_spec *spec, int prec)
    2546             : {
    2547           4 :         spec->precision = prec;
    2548           4 :         if (WARN_ONCE(spec->precision != prec, "precision %d too large", prec)) {
    2549           0 :                 spec->precision = clamp(prec, 0, PRECISION_MAX);
    2550             :         }
    2551           4 : }
    2552             : 
    2553             : /**
    2554             :  * vsnprintf - Format a string and place it in a buffer
    2555             :  * @buf: The buffer to place the result into
    2556             :  * @size: The size of the buffer, including the trailing null space
    2557             :  * @fmt: The format string to use
    2558             :  * @args: Arguments for the format string
    2559             :  *
    2560             :  * This function generally follows C99 vsnprintf, but has some
    2561             :  * extensions and a few limitations:
    2562             :  *
    2563             :  *  - ``%n`` is unsupported
    2564             :  *  - ``%p*`` is handled by pointer()
    2565             :  *
    2566             :  * See pointer() or Documentation/core-api/printk-formats.rst for more
    2567             :  * extensive description.
    2568             :  *
    2569             :  * **Please update the documentation in both places when making changes**
    2570             :  *
    2571             :  * The return value is the number of characters which would
    2572             :  * be generated for the given input, excluding the trailing
    2573             :  * '\0', as per ISO C99. If you want to have the exact
    2574             :  * number of characters written into @buf as return value
    2575             :  * (not including the trailing '\0'), use vscnprintf(). If the
    2576             :  * return is greater than or equal to @size, the resulting
    2577             :  * string is truncated.
    2578             :  *
    2579             :  * If you're not already dealing with a va_list consider using snprintf().
    2580             :  */
    2581       35677 : int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
    2582             : {
    2583       35677 :         unsigned long long num;
    2584       35677 :         char *str, *end;
    2585       35677 :         struct printf_spec spec = {0};
    2586             : 
    2587             :         /* Reject out-of-range values early.  Large positive sizes are
    2588             :            used for unknown buffer sizes. */
    2589       35677 :         if (WARN_ON_ONCE(size > INT_MAX))
    2590             :                 return 0;
    2591             : 
    2592       35677 :         str = buf;
    2593       35677 :         end = buf + size;
    2594             : 
    2595             :         /* Make sure end is always >= buf */
    2596       35677 :         if (end < buf) {
    2597           1 :                 end = ((void *)-1);
    2598           1 :                 size = end - buf;
    2599             :         }
    2600             : 
    2601      150086 :         while (*fmt) {
    2602      114407 :                 const char *old_fmt = fmt;
    2603      114407 :                 int read = format_decode(fmt, &spec);
    2604             : 
    2605      114409 :                 fmt += read;
    2606             : 
    2607      114409 :                 switch (spec.type) {
    2608       53878 :                 case FORMAT_TYPE_NONE: {
    2609       53878 :                         int copy = read;
    2610       53878 :                         if (str < end) {
    2611       52354 :                                 if (copy > end - str)
    2612         178 :                                         copy = end - str;
    2613       52354 :                                 memcpy(str, old_fmt, copy);
    2614             :                         }
    2615       53878 :                         str += read;
    2616       53878 :                         break;
    2617             :                 }
    2618             : 
    2619         134 :                 case FORMAT_TYPE_WIDTH:
    2620         134 :                         set_field_width(&spec, va_arg(args, int));
    2621         134 :                         break;
    2622             : 
    2623           4 :                 case FORMAT_TYPE_PRECISION:
    2624           4 :                         set_precision(&spec, va_arg(args, int));
    2625           4 :                         break;
    2626             : 
    2627         874 :                 case FORMAT_TYPE_CHAR: {
    2628         874 :                         char c;
    2629             : 
    2630         874 :                         if (!(spec.flags & LEFT)) {
    2631         874 :                                 while (--spec.field_width > 0) {
    2632           0 :                                         if (str < end)
    2633           0 :                                                 *str = ' ';
    2634           0 :                                         ++str;
    2635             : 
    2636             :                                 }
    2637             :                         }
    2638         874 :                         c = (unsigned char) va_arg(args, int);
    2639         874 :                         if (str < end)
    2640         875 :                                 *str = c;
    2641         874 :                         ++str;
    2642         874 :                         while (--spec.field_width > 0) {
    2643           0 :                                 if (str < end)
    2644           0 :                                         *str = ' ';
    2645           0 :                                 ++str;
    2646             :                         }
    2647             :                         break;
    2648             :                 }
    2649             : 
    2650       19345 :                 case FORMAT_TYPE_STR:
    2651       19345 :                         str = string(str, end, va_arg(args, char *), spec);
    2652       19345 :                         break;
    2653             : 
    2654         240 :                 case FORMAT_TYPE_PTR:
    2655         240 :                         str = pointer(fmt, str, end, va_arg(args, void *),
    2656             :                                       spec);
    2657         538 :                         while (isalnum(*fmt))
    2658         298 :                                 fmt++;
    2659             :                         break;
    2660             : 
    2661           0 :                 case FORMAT_TYPE_PERCENT_CHAR:
    2662           0 :                         if (str < end)
    2663           0 :                                 *str = '%';
    2664           0 :                         ++str;
    2665           0 :                         break;
    2666             : 
    2667           0 :                 case FORMAT_TYPE_INVALID:
    2668             :                         /*
    2669             :                          * Presumably the arguments passed gcc's type
    2670             :                          * checking, but there is no safe or sane way
    2671             :                          * for us to continue parsing the format and
    2672             :                          * fetching from the va_list; the remaining
    2673             :                          * specifiers and arguments would be out of
    2674             :                          * sync.
    2675             :                          */
    2676           0 :                         goto out;
    2677             : 
    2678       39934 :                 default:
    2679       39934 :                         switch (spec.type) {
    2680        1309 :                         case FORMAT_TYPE_LONG_LONG:
    2681        1309 :                                 num = va_arg(args, long long);
    2682        1309 :                                 break;
    2683        1374 :                         case FORMAT_TYPE_ULONG:
    2684        1374 :                                 num = va_arg(args, unsigned long);
    2685        1374 :                                 break;
    2686         996 :                         case FORMAT_TYPE_LONG:
    2687         996 :                                 num = va_arg(args, long);
    2688         996 :                                 break;
    2689          28 :                         case FORMAT_TYPE_SIZE_T:
    2690          28 :                                 if (spec.flags & SIGN)
    2691           0 :                                         num = va_arg(args, ssize_t);
    2692             :                                 else
    2693          28 :                                         num = va_arg(args, size_t);
    2694             :                                 break;
    2695           0 :                         case FORMAT_TYPE_PTRDIFF:
    2696           0 :                                 num = va_arg(args, ptrdiff_t);
    2697           0 :                                 break;
    2698           0 :                         case FORMAT_TYPE_UBYTE:
    2699           0 :                                 num = (unsigned char) va_arg(args, int);
    2700           0 :                                 break;
    2701           0 :                         case FORMAT_TYPE_BYTE:
    2702           0 :                                 num = (signed char) va_arg(args, int);
    2703           0 :                                 break;
    2704        1349 :                         case FORMAT_TYPE_USHORT:
    2705        1349 :                                 num = (unsigned short) va_arg(args, int);
    2706        1349 :                                 break;
    2707           3 :                         case FORMAT_TYPE_SHORT:
    2708           3 :                                 num = (short) va_arg(args, int);
    2709           3 :                                 break;
    2710       16151 :                         case FORMAT_TYPE_INT:
    2711       16151 :                                 num = (int) va_arg(args, int);
    2712       16148 :                                 break;
    2713       18724 :                         default:
    2714       18724 :                                 num = va_arg(args, unsigned int);
    2715             :                         }
    2716             : 
    2717       39931 :                         str = number(str, end, num, spec);
    2718             :                 }
    2719             :         }
    2720             : 
    2721       35679 : out:
    2722       35679 :         if (size > 0) {
    2723       34094 :                 if (str < end)
    2724       33806 :                         *str = '\0';
    2725             :                 else
    2726         288 :                         end[-1] = '\0';
    2727             :         }
    2728             : 
    2729             :         /* the trailing null byte doesn't count towards the total */
    2730       35679 :         return str-buf;
    2731             : 
    2732             : }
    2733             : EXPORT_SYMBOL(vsnprintf);
    2734             : 
    2735             : /**
    2736             :  * vscnprintf - Format a string and place it in a buffer
    2737             :  * @buf: The buffer to place the result into
    2738             :  * @size: The size of the buffer, including the trailing null space
    2739             :  * @fmt: The format string to use
    2740             :  * @args: Arguments for the format string
    2741             :  *
    2742             :  * The return value is the number of characters which have been written into
    2743             :  * the @buf not including the trailing '\0'. If @size is == 0 the function
    2744             :  * returns 0.
    2745             :  *
    2746             :  * If you're not already dealing with a va_list consider using scnprintf().
    2747             :  *
    2748             :  * See the vsnprintf() documentation for format string extensions over C99.
    2749             :  */
    2750        3564 : int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
    2751             : {
    2752        3564 :         int i;
    2753             : 
    2754        3564 :         i = vsnprintf(buf, size, fmt, args);
    2755             : 
    2756        3564 :         if (likely(i < size))
    2757             :                 return i;
    2758           0 :         if (size != 0)
    2759           0 :                 return size - 1;
    2760             :         return 0;
    2761             : }
    2762             : EXPORT_SYMBOL(vscnprintf);
    2763             : 
    2764             : /**
    2765             :  * snprintf - Format a string and place it in a buffer
    2766             :  * @buf: The buffer to place the result into
    2767             :  * @size: The size of the buffer, including the trailing null space
    2768             :  * @fmt: The format string to use
    2769             :  * @...: Arguments for the format string
    2770             :  *
    2771             :  * The return value is the number of characters which would be
    2772             :  * generated for the given input, excluding the trailing null,
    2773             :  * as per ISO C99.  If the return is greater than or equal to
    2774             :  * @size, the resulting string is truncated.
    2775             :  *
    2776             :  * See the vsnprintf() documentation for format string extensions over C99.
    2777             :  */
    2778        3876 : int snprintf(char *buf, size_t size, const char *fmt, ...)
    2779             : {
    2780        3876 :         va_list args;
    2781        3876 :         int i;
    2782             : 
    2783        3876 :         va_start(args, fmt);
    2784        3876 :         i = vsnprintf(buf, size, fmt, args);
    2785        3876 :         va_end(args);
    2786             : 
    2787        3876 :         return i;
    2788             : }
    2789             : EXPORT_SYMBOL(snprintf);
    2790             : 
    2791             : /**
    2792             :  * scnprintf - Format a string and place it in a buffer
    2793             :  * @buf: The buffer to place the result into
    2794             :  * @size: The size of the buffer, including the trailing null space
    2795             :  * @fmt: The format string to use
    2796             :  * @...: Arguments for the format string
    2797             :  *
    2798             :  * The return value is the number of characters written into @buf not including
    2799             :  * the trailing '\0'. If @size is == 0 the function returns 0.
    2800             :  */
    2801             : 
    2802         289 : int scnprintf(char *buf, size_t size, const char *fmt, ...)
    2803             : {
    2804         289 :         va_list args;
    2805         289 :         int i;
    2806             : 
    2807         289 :         va_start(args, fmt);
    2808         289 :         i = vscnprintf(buf, size, fmt, args);
    2809         289 :         va_end(args);
    2810             : 
    2811         289 :         return i;
    2812             : }
    2813             : EXPORT_SYMBOL(scnprintf);
    2814             : 
    2815             : /**
    2816             :  * vsprintf - Format a string and place it in a buffer
    2817             :  * @buf: The buffer to place the result into
    2818             :  * @fmt: The format string to use
    2819             :  * @args: Arguments for the format string
    2820             :  *
    2821             :  * The function returns the number of characters written
    2822             :  * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
    2823             :  * buffer overflows.
    2824             :  *
    2825             :  * If you're not already dealing with a va_list consider using sprintf().
    2826             :  *
    2827             :  * See the vsnprintf() documentation for format string extensions over C99.
    2828             :  */
    2829           0 : int vsprintf(char *buf, const char *fmt, va_list args)
    2830             : {
    2831           0 :         return vsnprintf(buf, INT_MAX, fmt, args);
    2832             : }
    2833             : EXPORT_SYMBOL(vsprintf);
    2834             : 
    2835             : /**
    2836             :  * sprintf - Format a string and place it in a buffer
    2837             :  * @buf: The buffer to place the result into
    2838             :  * @fmt: The format string to use
    2839             :  * @...: Arguments for the format string
    2840             :  *
    2841             :  * The function returns the number of characters written
    2842             :  * into @buf. Use snprintf() or scnprintf() in order to avoid
    2843             :  * buffer overflows.
    2844             :  *
    2845             :  * See the vsnprintf() documentation for format string extensions over C99.
    2846             :  */
    2847        1840 : int sprintf(char *buf, const char *fmt, ...)
    2848             : {
    2849        1840 :         va_list args;
    2850        1840 :         int i;
    2851             : 
    2852        1840 :         va_start(args, fmt);
    2853        1840 :         i = vsnprintf(buf, INT_MAX, fmt, args);
    2854        1840 :         va_end(args);
    2855             : 
    2856        1840 :         return i;
    2857             : }
    2858             : EXPORT_SYMBOL(sprintf);
    2859             : 
    2860             : #ifdef CONFIG_BINARY_PRINTF
    2861             : /*
    2862             :  * bprintf service:
    2863             :  * vbin_printf() - VA arguments to binary data
    2864             :  * bstr_printf() - Binary data to text string
    2865             :  */
    2866             : 
    2867             : /**
    2868             :  * vbin_printf - Parse a format string and place args' binary value in a buffer
    2869             :  * @bin_buf: The buffer to place args' binary value
    2870             :  * @size: The size of the buffer(by words(32bits), not characters)
    2871             :  * @fmt: The format string to use
    2872             :  * @args: Arguments for the format string
    2873             :  *
    2874             :  * The format follows C99 vsnprintf, except %n is ignored, and its argument
    2875             :  * is skipped.
    2876             :  *
    2877             :  * The return value is the number of words(32bits) which would be generated for
    2878             :  * the given input.
    2879             :  *
    2880             :  * NOTE:
    2881             :  * If the return value is greater than @size, the resulting bin_buf is NOT
    2882             :  * valid for bstr_printf().
    2883             :  */
    2884           0 : int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
    2885             : {
    2886           0 :         struct printf_spec spec = {0};
    2887           0 :         char *str, *end;
    2888           0 :         int width;
    2889             : 
    2890           0 :         str = (char *)bin_buf;
    2891           0 :         end = (char *)(bin_buf + size);
    2892             : 
    2893             : #define save_arg(type)                                                  \
    2894             : ({                                                                      \
    2895             :         unsigned long long value;                                       \
    2896             :         if (sizeof(type) == 8) {                                        \
    2897             :                 unsigned long long val8;                                \
    2898             :                 str = PTR_ALIGN(str, sizeof(u32));                      \
    2899             :                 val8 = va_arg(args, unsigned long long);                \
    2900             :                 if (str + sizeof(type) <= end) {                     \
    2901             :                         *(u32 *)str = *(u32 *)&val8;                        \
    2902             :                         *(u32 *)(str + 4) = *((u32 *)&val8 + 1);    \
    2903             :                 }                                                       \
    2904             :                 value = val8;                                           \
    2905             :         } else {                                                        \
    2906             :                 unsigned int val4;                                      \
    2907             :                 str = PTR_ALIGN(str, sizeof(type));                     \
    2908             :                 val4 = va_arg(args, int);                               \
    2909             :                 if (str + sizeof(type) <= end)                               \
    2910             :                         *(typeof(type) *)str = (type)(long)val4;        \
    2911             :                 value = (unsigned long long)val4;                       \
    2912             :         }                                                               \
    2913             :         str += sizeof(type);                                            \
    2914             :         value;                                                          \
    2915             : })
    2916             : 
    2917           0 :         while (*fmt) {
    2918           0 :                 int read = format_decode(fmt, &spec);
    2919             : 
    2920           0 :                 fmt += read;
    2921             : 
    2922           0 :                 switch (spec.type) {
    2923             :                 case FORMAT_TYPE_NONE:
    2924             :                 case FORMAT_TYPE_PERCENT_CHAR:
    2925             :                         break;
    2926           0 :                 case FORMAT_TYPE_INVALID:
    2927           0 :                         goto out;
    2928             : 
    2929             :                 case FORMAT_TYPE_WIDTH:
    2930             :                 case FORMAT_TYPE_PRECISION:
    2931           0 :                         width = (int)save_arg(int);
    2932             :                         /* Pointers may require the width */
    2933           0 :                         if (*fmt == 'p')
    2934           0 :                                 set_field_width(&spec, width);
    2935             :                         break;
    2936             : 
    2937             :                 case FORMAT_TYPE_CHAR:
    2938           0 :                         save_arg(char);
    2939           0 :                         break;
    2940             : 
    2941           0 :                 case FORMAT_TYPE_STR: {
    2942           0 :                         const char *save_str = va_arg(args, char *);
    2943           0 :                         const char *err_msg;
    2944           0 :                         size_t len;
    2945             : 
    2946           0 :                         err_msg = check_pointer_msg(save_str);
    2947             :                         if (err_msg)
    2948             :                                 save_str = err_msg;
    2949             : 
    2950           0 :                         len = strlen(save_str) + 1;
    2951           0 :                         if (str + len < end)
    2952           0 :                                 memcpy(str, save_str, len);
    2953             :                         str += len;
    2954             :                         break;
    2955             :                 }
    2956             : 
    2957           0 :                 case FORMAT_TYPE_PTR:
    2958             :                         /* Dereferenced pointers must be done now */
    2959           0 :                         switch (*fmt) {
    2960             :                         /* Dereference of functions is still OK */
    2961             :                         case 'S':
    2962             :                         case 's':
    2963             :                         case 'x':
    2964             :                         case 'K':
    2965             :                         case 'e':
    2966           0 :                                 save_arg(void *);
    2967             :                                 break;
    2968           0 :                         default:
    2969           0 :                                 if (!isalnum(*fmt)) {
    2970           0 :                                         save_arg(void *);
    2971             :                                         break;
    2972             :                                 }
    2973           0 :                                 str = pointer(fmt, str, end, va_arg(args, void *),
    2974             :                                               spec);
    2975           0 :                                 if (str + 1 < end)
    2976           0 :                                         *str++ = '\0';
    2977             :                                 else
    2978           0 :                                         end[-1] = '\0'; /* Must be nul terminated */
    2979             :                         }
    2980             :                         /* skip all alphanumeric pointer suffixes */
    2981           0 :                         while (isalnum(*fmt))
    2982           0 :                                 fmt++;
    2983             :                         break;
    2984             : 
    2985           0 :                 default:
    2986           0 :                         switch (spec.type) {
    2987             : 
    2988             :                         case FORMAT_TYPE_LONG_LONG:
    2989           0 :                                 save_arg(long long);
    2990             :                                 break;
    2991             :                         case FORMAT_TYPE_ULONG:
    2992             :                         case FORMAT_TYPE_LONG:
    2993           0 :                                 save_arg(unsigned long);
    2994             :                                 break;
    2995             :                         case FORMAT_TYPE_SIZE_T:
    2996           0 :                                 save_arg(size_t);
    2997             :                                 break;
    2998             :                         case FORMAT_TYPE_PTRDIFF:
    2999           0 :                                 save_arg(ptrdiff_t);
    3000             :                                 break;
    3001             :                         case FORMAT_TYPE_UBYTE:
    3002             :                         case FORMAT_TYPE_BYTE:
    3003           0 :                                 save_arg(char);
    3004           0 :                                 break;
    3005             :                         case FORMAT_TYPE_USHORT:
    3006             :                         case FORMAT_TYPE_SHORT:
    3007           0 :                                 save_arg(short);
    3008           0 :                                 break;
    3009             :                         default:
    3010           0 :                                 save_arg(int);
    3011             :                         }
    3012             :                 }
    3013             :         }
    3014             : 
    3015           0 : out:
    3016           0 :         return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
    3017             : #undef save_arg
    3018             : }
    3019             : EXPORT_SYMBOL_GPL(vbin_printf);
    3020             : 
    3021             : /**
    3022             :  * bstr_printf - Format a string from binary arguments and place it in a buffer
    3023             :  * @buf: The buffer to place the result into
    3024             :  * @size: The size of the buffer, including the trailing null space
    3025             :  * @fmt: The format string to use
    3026             :  * @bin_buf: Binary arguments for the format string
    3027             :  *
    3028             :  * This function like C99 vsnprintf, but the difference is that vsnprintf gets
    3029             :  * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
    3030             :  * a binary buffer that generated by vbin_printf.
    3031             :  *
    3032             :  * The format follows C99 vsnprintf, but has some extensions:
    3033             :  *  see vsnprintf comment for details.
    3034             :  *
    3035             :  * The return value is the number of characters which would
    3036             :  * be generated for the given input, excluding the trailing
    3037             :  * '\0', as per ISO C99. If you want to have the exact
    3038             :  * number of characters written into @buf as return value
    3039             :  * (not including the trailing '\0'), use vscnprintf(). If the
    3040             :  * return is greater than or equal to @size, the resulting
    3041             :  * string is truncated.
    3042             :  */
    3043           0 : int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
    3044             : {
    3045           0 :         struct printf_spec spec = {0};
    3046           0 :         char *str, *end;
    3047           0 :         const char *args = (const char *)bin_buf;
    3048             : 
    3049           0 :         if (WARN_ON_ONCE(size > INT_MAX))
    3050             :                 return 0;
    3051             : 
    3052           0 :         str = buf;
    3053           0 :         end = buf + size;
    3054             : 
    3055             : #define get_arg(type)                                                   \
    3056             : ({                                                                      \
    3057             :         typeof(type) value;                                             \
    3058             :         if (sizeof(type) == 8) {                                        \
    3059             :                 args = PTR_ALIGN(args, sizeof(u32));                    \
    3060             :                 *(u32 *)&value = *(u32 *)args;                              \
    3061             :                 *((u32 *)&value + 1) = *(u32 *)(args + 4);          \
    3062             :         } else {                                                        \
    3063             :                 args = PTR_ALIGN(args, sizeof(type));                   \
    3064             :                 value = *(typeof(type) *)args;                          \
    3065             :         }                                                               \
    3066             :         args += sizeof(type);                                           \
    3067             :         value;                                                          \
    3068             : })
    3069             : 
    3070             :         /* Make sure end is always >= buf */
    3071           0 :         if (end < buf) {
    3072           0 :                 end = ((void *)-1);
    3073           0 :                 size = end - buf;
    3074             :         }
    3075             : 
    3076           0 :         while (*fmt) {
    3077           0 :                 const char *old_fmt = fmt;
    3078           0 :                 int read = format_decode(fmt, &spec);
    3079             : 
    3080           0 :                 fmt += read;
    3081             : 
    3082           0 :                 switch (spec.type) {
    3083           0 :                 case FORMAT_TYPE_NONE: {
    3084           0 :                         int copy = read;
    3085           0 :                         if (str < end) {
    3086           0 :                                 if (copy > end - str)
    3087           0 :                                         copy = end - str;
    3088           0 :                                 memcpy(str, old_fmt, copy);
    3089             :                         }
    3090           0 :                         str += read;
    3091           0 :                         break;
    3092             :                 }
    3093             : 
    3094             :                 case FORMAT_TYPE_WIDTH:
    3095           0 :                         set_field_width(&spec, get_arg(int));
    3096           0 :                         break;
    3097             : 
    3098             :                 case FORMAT_TYPE_PRECISION:
    3099           0 :                         set_precision(&spec, get_arg(int));
    3100           0 :                         break;
    3101             : 
    3102           0 :                 case FORMAT_TYPE_CHAR: {
    3103           0 :                         char c;
    3104             : 
    3105           0 :                         if (!(spec.flags & LEFT)) {
    3106           0 :                                 while (--spec.field_width > 0) {
    3107           0 :                                         if (str < end)
    3108           0 :                                                 *str = ' ';
    3109           0 :                                         ++str;
    3110             :                                 }
    3111             :                         }
    3112           0 :                         c = (unsigned char) get_arg(char);
    3113           0 :                         if (str < end)
    3114           0 :                                 *str = c;
    3115           0 :                         ++str;
    3116           0 :                         while (--spec.field_width > 0) {
    3117           0 :                                 if (str < end)
    3118           0 :                                         *str = ' ';
    3119           0 :                                 ++str;
    3120             :                         }
    3121             :                         break;
    3122             :                 }
    3123             : 
    3124           0 :                 case FORMAT_TYPE_STR: {
    3125           0 :                         const char *str_arg = args;
    3126           0 :                         args += strlen(str_arg) + 1;
    3127           0 :                         str = string(str, end, (char *)str_arg, spec);
    3128           0 :                         break;
    3129             :                 }
    3130             : 
    3131           0 :                 case FORMAT_TYPE_PTR: {
    3132           0 :                         bool process = false;
    3133           0 :                         int copy, len;
    3134             :                         /* Non function dereferences were already done */
    3135           0 :                         switch (*fmt) {
    3136             :                         case 'S':
    3137             :                         case 's':
    3138             :                         case 'F':
    3139             :                         case 'f':
    3140             :                         case 'x':
    3141             :                         case 'K':
    3142             :                         case 'e':
    3143             :                                 process = true;
    3144             :                                 break;
    3145           0 :                         default:
    3146           0 :                                 if (!isalnum(*fmt)) {
    3147             :                                         process = true;
    3148             :                                         break;
    3149             :                                 }
    3150             :                                 /* Pointer dereference was already processed */
    3151           0 :                                 if (str < end) {
    3152           0 :                                         len = copy = strlen(args);
    3153           0 :                                         if (copy > end - str)
    3154           0 :                                                 copy = end - str;
    3155           0 :                                         memcpy(str, args, copy);
    3156           0 :                                         str += len;
    3157           0 :                                         args += len + 1;
    3158             :                                 }
    3159             :                         }
    3160           0 :                         if (process)
    3161           0 :                                 str = pointer(fmt, str, end, get_arg(void *), spec);
    3162             : 
    3163           0 :                         while (isalnum(*fmt))
    3164           0 :                                 fmt++;
    3165             :                         break;
    3166             :                 }
    3167             : 
    3168           0 :                 case FORMAT_TYPE_PERCENT_CHAR:
    3169           0 :                         if (str < end)
    3170           0 :                                 *str = '%';
    3171           0 :                         ++str;
    3172           0 :                         break;
    3173             : 
    3174           0 :                 case FORMAT_TYPE_INVALID:
    3175           0 :                         goto out;
    3176             : 
    3177           0 :                 default: {
    3178           0 :                         unsigned long long num;
    3179             : 
    3180           0 :                         switch (spec.type) {
    3181             : 
    3182             :                         case FORMAT_TYPE_LONG_LONG:
    3183           0 :                                 num = get_arg(long long);
    3184           0 :                                 break;
    3185             :                         case FORMAT_TYPE_ULONG:
    3186             :                         case FORMAT_TYPE_LONG:
    3187           0 :                                 num = get_arg(unsigned long);
    3188           0 :                                 break;
    3189             :                         case FORMAT_TYPE_SIZE_T:
    3190           0 :                                 num = get_arg(size_t);
    3191           0 :                                 break;
    3192             :                         case FORMAT_TYPE_PTRDIFF:
    3193           0 :                                 num = get_arg(ptrdiff_t);
    3194           0 :                                 break;
    3195             :                         case FORMAT_TYPE_UBYTE:
    3196           0 :                                 num = get_arg(unsigned char);
    3197           0 :                                 break;
    3198             :                         case FORMAT_TYPE_BYTE:
    3199           0 :                                 num = get_arg(signed char);
    3200           0 :                                 break;
    3201             :                         case FORMAT_TYPE_USHORT:
    3202           0 :                                 num = get_arg(unsigned short);
    3203           0 :                                 break;
    3204             :                         case FORMAT_TYPE_SHORT:
    3205           0 :                                 num = get_arg(short);
    3206           0 :                                 break;
    3207             :                         case FORMAT_TYPE_UINT:
    3208           0 :                                 num = get_arg(unsigned int);
    3209           0 :                                 break;
    3210             :                         default:
    3211           0 :                                 num = get_arg(int);
    3212             :                         }
    3213             : 
    3214           0 :                         str = number(str, end, num, spec);
    3215             :                 } /* default: */
    3216             :                 } /* switch(spec.type) */
    3217             :         } /* while(*fmt) */
    3218             : 
    3219           0 : out:
    3220           0 :         if (size > 0) {
    3221           0 :                 if (str < end)
    3222           0 :                         *str = '\0';
    3223             :                 else
    3224           0 :                         end[-1] = '\0';
    3225             :         }
    3226             : 
    3227             : #undef get_arg
    3228             : 
    3229             :         /* the trailing null byte doesn't count towards the total */
    3230           0 :         return str - buf;
    3231             : }
    3232             : EXPORT_SYMBOL_GPL(bstr_printf);
    3233             : 
    3234             : /**
    3235             :  * bprintf - Parse a format string and place args' binary value in a buffer
    3236             :  * @bin_buf: The buffer to place args' binary value
    3237             :  * @size: The size of the buffer(by words(32bits), not characters)
    3238             :  * @fmt: The format string to use
    3239             :  * @...: Arguments for the format string
    3240             :  *
    3241             :  * The function returns the number of words(u32) written
    3242             :  * into @bin_buf.
    3243             :  */
    3244           0 : int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
    3245             : {
    3246           0 :         va_list args;
    3247           0 :         int ret;
    3248             : 
    3249           0 :         va_start(args, fmt);
    3250           0 :         ret = vbin_printf(bin_buf, size, fmt, args);
    3251           0 :         va_end(args);
    3252             : 
    3253           0 :         return ret;
    3254             : }
    3255             : EXPORT_SYMBOL_GPL(bprintf);
    3256             : 
    3257             : #endif /* CONFIG_BINARY_PRINTF */
    3258             : 
    3259             : /**
    3260             :  * vsscanf - Unformat a buffer into a list of arguments
    3261             :  * @buf:        input buffer
    3262             :  * @fmt:        format of buffer
    3263             :  * @args:       arguments
    3264             :  */
    3265           3 : int vsscanf(const char *buf, const char *fmt, va_list args)
    3266             : {
    3267           3 :         const char *str = buf;
    3268           3 :         char *next;
    3269           3 :         char digit;
    3270           3 :         int num = 0;
    3271           3 :         u8 qualifier;
    3272           3 :         unsigned int base;
    3273           3 :         union {
    3274             :                 long long s;
    3275             :                 unsigned long long u;
    3276             :         } val;
    3277           3 :         s16 field_width;
    3278           3 :         bool is_sign;
    3279             : 
    3280          13 :         while (*fmt) {
    3281             :                 /* skip any white space in format */
    3282             :                 /* white space in format matchs any amount of
    3283             :                  * white space, including none, in the input.
    3284             :                  */
    3285          13 :                 if (isspace(*fmt)) {
    3286           0 :                         fmt = skip_spaces(++fmt);
    3287           0 :                         str = skip_spaces(str);
    3288             :                 }
    3289             : 
    3290             :                 /* anything that is not a conversion must match exactly */
    3291          13 :                 if (*fmt != '%' && *fmt) {
    3292           7 :                         if (*fmt++ != *str++)
    3293             :                                 break;
    3294           4 :                         continue;
    3295             :                 }
    3296             : 
    3297           6 :                 if (!*fmt)
    3298             :                         break;
    3299           6 :                 ++fmt;
    3300             : 
    3301             :                 /* skip this conversion.
    3302             :                  * advance both strings to next white space
    3303             :                  */
    3304           6 :                 if (*fmt == '*') {
    3305           0 :                         if (!*str)
    3306             :                                 break;
    3307           0 :                         while (!isspace(*fmt) && *fmt != '%' && *fmt) {
    3308             :                                 /* '%*[' not yet supported, invalid format */
    3309           0 :                                 if (*fmt == '[')
    3310           0 :                                         return num;
    3311           0 :                                 fmt++;
    3312             :                         }
    3313           0 :                         while (!isspace(*str) && *str)
    3314           0 :                                 str++;
    3315           0 :                         continue;
    3316             :                 }
    3317             : 
    3318             :                 /* get field width */
    3319           6 :                 field_width = -1;
    3320           6 :                 if (isdigit(*fmt)) {
    3321           0 :                         field_width = skip_atoi(&fmt);
    3322           0 :                         if (field_width <= 0)
    3323             :                                 break;
    3324             :                 }
    3325             : 
    3326             :                 /* get conversion qualifier */
    3327           6 :                 qualifier = -1;
    3328           6 :                 if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
    3329             :                     *fmt == 'z') {
    3330           2 :                         qualifier = *fmt++;
    3331           2 :                         if (unlikely(qualifier == *fmt)) {
    3332           2 :                                 if (qualifier == 'h') {
    3333           0 :                                         qualifier = 'H';
    3334           0 :                                         fmt++;
    3335           2 :                                 } else if (qualifier == 'l') {
    3336           2 :                                         qualifier = 'L';
    3337           2 :                                         fmt++;
    3338             :                                 }
    3339             :                         }
    3340             :                 }
    3341             : 
    3342           6 :                 if (!*fmt)
    3343             :                         break;
    3344             : 
    3345           6 :                 if (*fmt == 'n') {
    3346             :                         /* return number of characters read so far */
    3347           2 :                         *va_arg(args, int *) = str - buf;
    3348           2 :                         ++fmt;
    3349           2 :                         continue;
    3350             :                 }
    3351             : 
    3352           4 :                 if (!*str)
    3353             :                         break;
    3354             : 
    3355           4 :                 base = 10;
    3356           4 :                 is_sign = false;
    3357             : 
    3358           4 :                 switch (*fmt++) {
    3359           0 :                 case 'c':
    3360             :                 {
    3361           0 :                         char *s = (char *)va_arg(args, char*);
    3362           0 :                         if (field_width == -1)
    3363           0 :                                 field_width = 1;
    3364           0 :                         do {
    3365           0 :                                 *s++ = *str++;
    3366           0 :                         } while (--field_width > 0 && *str);
    3367           0 :                         num++;
    3368             :                 }
    3369           0 :                 continue;
    3370           0 :                 case 's':
    3371             :                 {
    3372           0 :                         char *s = (char *)va_arg(args, char *);
    3373           0 :                         if (field_width == -1)
    3374           0 :                                 field_width = SHRT_MAX;
    3375             :                         /* first, skip leading white space in buffer */
    3376           0 :                         str = skip_spaces(str);
    3377             : 
    3378             :                         /* now copy until next white space */
    3379           0 :                         while (*str && !isspace(*str) && field_width--)
    3380           0 :                                 *s++ = *str++;
    3381           0 :                         *s = '\0';
    3382           0 :                         num++;
    3383             :                 }
    3384           0 :                 continue;
    3385             :                 /*
    3386             :                  * Warning: This implementation of the '[' conversion specifier
    3387             :                  * deviates from its glibc counterpart in the following ways:
    3388             :                  * (1) It does NOT support ranges i.e. '-' is NOT a special
    3389             :                  *     character
    3390             :                  * (2) It cannot match the closing bracket ']' itself
    3391             :                  * (3) A field width is required
    3392             :                  * (4) '%*[' (discard matching input) is currently not supported
    3393             :                  *
    3394             :                  * Example usage:
    3395             :                  * ret = sscanf("00:0a:95","%2[^:]:%2[^:]:%2[^:]",
    3396             :                  *              buf1, buf2, buf3);
    3397             :                  * if (ret < 3)
    3398             :                  *    // etc..
    3399             :                  */
    3400           0 :                 case '[':
    3401             :                 {
    3402           0 :                         char *s = (char *)va_arg(args, char *);
    3403           0 :                         DECLARE_BITMAP(set, 256) = {0};
    3404           0 :                         unsigned int len = 0;
    3405           0 :                         bool negate = (*fmt == '^');
    3406             : 
    3407             :                         /* field width is required */
    3408           0 :                         if (field_width == -1)
    3409           0 :                                 return num;
    3410             : 
    3411           0 :                         if (negate)
    3412           0 :                                 ++fmt;
    3413             : 
    3414           0 :                         for ( ; *fmt && *fmt != ']'; ++fmt, ++len)
    3415           0 :                                 set_bit((u8)*fmt, set);
    3416             : 
    3417             :                         /* no ']' or no character set found */
    3418           0 :                         if (!*fmt || !len)
    3419           0 :                                 return num;
    3420           0 :                         ++fmt;
    3421             : 
    3422           0 :                         if (negate) {
    3423           0 :                                 bitmap_complement(set, set, 256);
    3424             :                                 /* exclude null '\0' byte */
    3425           0 :                                 clear_bit(0, set);
    3426             :                         }
    3427             : 
    3428             :                         /* match must be non-empty */
    3429           0 :                         if (!test_bit((u8)*str, set))
    3430           0 :                                 return num;
    3431             : 
    3432           0 :                         while (test_bit((u8)*str, set) && field_width--)
    3433           0 :                                 *s++ = *str++;
    3434           0 :                         *s = '\0';
    3435           0 :                         ++num;
    3436             :                 }
    3437           0 :                 continue;
    3438           0 :                 case 'o':
    3439           0 :                         base = 8;
    3440           0 :                         break;
    3441           0 :                 case 'x':
    3442             :                 case 'X':
    3443           0 :                         base = 16;
    3444           0 :                         break;
    3445           2 :                 case 'i':
    3446           2 :                         base = 0;
    3447             :                         fallthrough;
    3448             :                 case 'd':
    3449             :                         is_sign = true;
    3450             :                         fallthrough;
    3451             :                 case 'u':
    3452             :                         break;
    3453           0 :                 case '%':
    3454             :                         /* looking for '%' in str */
    3455           0 :                         if (*str++ != '%')
    3456           0 :                                 return num;
    3457           0 :                         continue;
    3458             :                 default:
    3459             :                         /* invalid format; stop here */
    3460             :                         return num;
    3461             :                 }
    3462             : 
    3463             :                 /* have some sort of integer conversion.
    3464             :                  * first, skip white space in buffer.
    3465             :                  */
    3466           4 :                 str = skip_spaces(str);
    3467             : 
    3468           4 :                 digit = *str;
    3469           4 :                 if (is_sign && digit == '-')
    3470           0 :                         digit = *(str + 1);
    3471             : 
    3472           4 :                 if (!digit
    3473           4 :                     || (base == 16 && !isxdigit(digit))
    3474           4 :                     || (base == 10 && !isdigit(digit))
    3475           4 :                     || (base == 8 && (!isdigit(digit) || digit > '7'))
    3476           4 :                     || (base == 0 && !isdigit(digit)))
    3477             :                         break;
    3478             : 
    3479           4 :                 if (is_sign)
    3480           2 :                         val.s = qualifier != 'L' ?
    3481           2 :                                 simple_strtol(str, &next, base) :
    3482           2 :                                 simple_strtoll(str, &next, base);
    3483             :                 else
    3484           2 :                         val.u = qualifier != 'L' ?
    3485           2 :                                 simple_strtoul(str, &next, base) :
    3486           0 :                                 simple_strtoull(str, &next, base);
    3487             : 
    3488           4 :                 if (field_width > 0 && next - str > field_width) {
    3489           0 :                         if (base == 0)
    3490           0 :                                 _parse_integer_fixup_radix(str, &base);
    3491           0 :                         while (next - str > field_width) {
    3492           0 :                                 if (is_sign)
    3493           0 :                                         val.s = div_s64(val.s, base);
    3494             :                                 else
    3495           0 :                                         val.u = div_u64(val.u, base);
    3496           0 :                                 --next;
    3497             :                         }
    3498             :                 }
    3499             : 
    3500           4 :                 switch (qualifier) {
    3501           0 :                 case 'H':       /* that's 'hh' in format */
    3502           0 :                         if (is_sign)
    3503           0 :                                 *va_arg(args, signed char *) = val.s;
    3504             :                         else
    3505           0 :                                 *va_arg(args, unsigned char *) = val.u;
    3506             :                         break;
    3507           0 :                 case 'h':
    3508           0 :                         if (is_sign)
    3509           0 :                                 *va_arg(args, short *) = val.s;
    3510             :                         else
    3511           0 :                                 *va_arg(args, unsigned short *) = val.u;
    3512             :                         break;
    3513           0 :                 case 'l':
    3514           0 :                         if (is_sign)
    3515           0 :                                 *va_arg(args, long *) = val.s;
    3516             :                         else
    3517           0 :                                 *va_arg(args, unsigned long *) = val.u;
    3518             :                         break;
    3519           2 :                 case 'L':
    3520           2 :                         if (is_sign)
    3521           2 :                                 *va_arg(args, long long *) = val.s;
    3522             :                         else
    3523           0 :                                 *va_arg(args, unsigned long long *) = val.u;
    3524             :                         break;
    3525           0 :                 case 'z':
    3526           0 :                         *va_arg(args, size_t *) = val.u;
    3527           0 :                         break;
    3528           2 :                 default:
    3529           2 :                         if (is_sign)
    3530           0 :                                 *va_arg(args, int *) = val.s;
    3531             :                         else
    3532           2 :                                 *va_arg(args, unsigned int *) = val.u;
    3533             :                         break;
    3534             :                 }
    3535           4 :                 num++;
    3536             : 
    3537           4 :                 if (!next)
    3538             :                         break;
    3539             :                 str = next;
    3540             :         }
    3541             : 
    3542             :         return num;
    3543             : }
    3544             : EXPORT_SYMBOL(vsscanf);
    3545             : 
    3546             : /**
    3547             :  * sscanf - Unformat a buffer into a list of arguments
    3548             :  * @buf:        input buffer
    3549             :  * @fmt:        formatting of buffer
    3550             :  * @...:        resulting arguments
    3551             :  */
    3552           3 : int sscanf(const char *buf, const char *fmt, ...)
    3553             : {
    3554           3 :         va_list args;
    3555           3 :         int i;
    3556             : 
    3557           3 :         va_start(args, fmt);
    3558           3 :         i = vsscanf(buf, fmt, args);
    3559           3 :         va_end(args);
    3560             : 
    3561           3 :         return i;
    3562             : }
    3563             : EXPORT_SYMBOL(sscanf);

Generated by: LCOV version 1.14