1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <stdarg.h>
20#include <linux/module.h>
21#include <linux/types.h>
22#include <linux/string.h>
23#include <linux/ctype.h>
24#include <linux/kernel.h>
25#include <linux/kallsyms.h>
26#include <linux/math64.h>
27#include <linux/uaccess.h>
28#include <linux/ioport.h>
29#include <linux/dcache.h>
30#include <linux/cred.h>
31#include <net/addrconf.h>
32
33#include <asm/page.h>
34#include <asm/sections.h>
35
36#include <linux/string_helpers.h>
37#include "kstrtox.h"
38
39
40
41
42
43
44
45
46
47unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
48{
49 unsigned long long result;
50 unsigned int rv;
51
52 cp = _parse_integer_fixup_radix(cp, &base);
53 rv = _parse_integer(cp, base, &result);
54
55 cp += (rv & ~KSTRTOX_OVERFLOW);
56
57 if (endp)
58 *endp = (char *)cp;
59
60 return result;
61}
62EXPORT_SYMBOL(simple_strtoull);
63
64
65
66
67
68
69
70
71
72unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
73{
74 return simple_strtoull(cp, endp, base);
75}
76EXPORT_SYMBOL(simple_strtoul);
77
78
79
80
81
82
83
84
85
86long simple_strtol(const char *cp, char **endp, unsigned int base)
87{
88 if (*cp == '-')
89 return -simple_strtoul(cp + 1, endp, base);
90
91 return simple_strtoul(cp, endp, base);
92}
93EXPORT_SYMBOL(simple_strtol);
94
95
96
97
98
99
100
101
102
103long long simple_strtoll(const char *cp, char **endp, unsigned int base)
104{
105 if (*cp == '-')
106 return -simple_strtoull(cp + 1, endp, base);
107
108 return simple_strtoull(cp, endp, base);
109}
110EXPORT_SYMBOL(simple_strtoll);
111
112static noinline_for_stack
113int skip_atoi(const char **s)
114{
115 int i = 0;
116
117 while (isdigit(**s))
118 i = i*10 + *((*s)++) - '0';
119
120 return i;
121}
122
123
124
125
126
127
128
129
130#if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
131
132static noinline_for_stack
133char *put_dec_full9(char *buf, unsigned q)
134{
135 unsigned r;
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156 r = (q * (uint64_t)0x1999999a) >> 32;
157 *buf++ = (q - 10 * r) + '0';
158 q = (r * (uint64_t)0x1999999a) >> 32;
159 *buf++ = (r - 10 * q) + '0';
160 r = (q * (uint64_t)0x1999999a) >> 32;
161 *buf++ = (q - 10 * r) + '0';
162 q = (r * (uint64_t)0x1999999a) >> 32;
163 *buf++ = (r - 10 * q) + '0';
164 r = (q * (uint64_t)0x1999999a) >> 32;
165 *buf++ = (q - 10 * r) + '0';
166
167 q = (r * 0x199a) >> 16;
168 *buf++ = (r - 10 * q) + '0';
169 r = (q * 0xcd) >> 11;
170 *buf++ = (q - 10 * r) + '0';
171 q = (r * 0xcd) >> 11;
172 *buf++ = (r - 10 * q) + '0';
173 *buf++ = q + '0';
174 return buf;
175}
176#endif
177
178
179
180
181
182static noinline_for_stack
183char *put_dec_trunc8(char *buf, unsigned r)
184{
185 unsigned q;
186
187
188 while (r >= 10000) {
189 q = r + '0';
190 r = (r * (uint64_t)0x1999999a) >> 32;
191 *buf++ = q - 10*r;
192 }
193
194 q = (r * 0x199a) >> 16;
195 *buf++ = (r - 10 * q) + '0';
196 if (q == 0)
197 return buf;
198 r = (q * 0xcd) >> 11;
199 *buf++ = (q - 10 * r) + '0';
200 if (r == 0)
201 return buf;
202 q = (r * 0xcd) >> 11;
203 *buf++ = (r - 10 * q) + '0';
204 if (q == 0)
205 return buf;
206 *buf++ = q + '0';
207 return buf;
208}
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227#if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
228
229
230
231static
232char *put_dec(char *buf, unsigned long long n)
233{
234 if (n >= 100*1000*1000) {
235 while (n >= 1000*1000*1000)
236 buf = put_dec_full9(buf, do_div(n, 1000*1000*1000));
237 if (n >= 100*1000*1000)
238 return put_dec_full9(buf, n);
239 }
240 return put_dec_trunc8(buf, n);
241}
242
243#else
244
245
246
247
248static noinline_for_stack
249void put_dec_full4(char *buf, unsigned q)
250{
251 unsigned r;
252 r = (q * 0xccd) >> 15;
253 buf[0] = (q - 10 * r) + '0';
254 q = (r * 0xcd) >> 11;
255 buf[1] = (r - 10 * q) + '0';
256 r = (q * 0xcd) >> 11;
257 buf[2] = (q - 10 * r) + '0';
258 buf[3] = r + '0';
259}
260
261
262
263
264
265
266
267
268static
269unsigned put_dec_helper4(char *buf, unsigned x)
270{
271 uint32_t q = (x * (uint64_t)0x346DC5D7) >> 43;
272
273 put_dec_full4(buf, x - q * 10000);
274 return q;
275}
276
277
278
279
280
281
282static
283char *put_dec(char *buf, unsigned long long n)
284{
285 uint32_t d3, d2, d1, q, h;
286
287 if (n < 100*1000*1000)
288 return put_dec_trunc8(buf, n);
289
290 d1 = ((uint32_t)n >> 16);
291 h = (n >> 32);
292 d2 = (h ) & 0xffff;
293 d3 = (h >> 16);
294
295 q = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff);
296 q = put_dec_helper4(buf, q);
297
298 q += 7671 * d3 + 9496 * d2 + 6 * d1;
299 q = put_dec_helper4(buf+4, q);
300
301 q += 4749 * d3 + 42 * d2;
302 q = put_dec_helper4(buf+8, q);
303
304 q += 281 * d3;
305 buf += 12;
306 if (q)
307 buf = put_dec_trunc8(buf, q);
308 else while (buf[-1] == '0')
309 --buf;
310
311 return buf;
312}
313
314#endif
315
316
317
318
319
320
321
322int num_to_str(char *buf, int size, unsigned long long num)
323{
324 char tmp[sizeof(num) * 3];
325 int idx, len;
326
327
328 if (num <= 9) {
329 tmp[0] = '0' + num;
330 len = 1;
331 } else {
332 len = put_dec(tmp, num) - tmp;
333 }
334
335 if (len > size)
336 return 0;
337 for (idx = 0; idx < len; ++idx)
338 buf[idx] = tmp[len - idx - 1];
339 return len;
340}
341
342#define ZEROPAD 1
343#define SIGN 2
344#define PLUS 4
345#define SPACE 8
346#define LEFT 16
347#define SMALL 32
348#define SPECIAL 64
349
350enum format_type {
351 FORMAT_TYPE_NONE,
352 FORMAT_TYPE_WIDTH,
353 FORMAT_TYPE_PRECISION,
354 FORMAT_TYPE_CHAR,
355 FORMAT_TYPE_STR,
356 FORMAT_TYPE_PTR,
357 FORMAT_TYPE_PERCENT_CHAR,
358 FORMAT_TYPE_INVALID,
359 FORMAT_TYPE_LONG_LONG,
360 FORMAT_TYPE_ULONG,
361 FORMAT_TYPE_LONG,
362 FORMAT_TYPE_UBYTE,
363 FORMAT_TYPE_BYTE,
364 FORMAT_TYPE_USHORT,
365 FORMAT_TYPE_SHORT,
366 FORMAT_TYPE_UINT,
367 FORMAT_TYPE_INT,
368 FORMAT_TYPE_SIZE_T,
369 FORMAT_TYPE_PTRDIFF
370};
371
372struct printf_spec {
373 u8 type;
374 u8 flags;
375 u8 base;
376 u8 qualifier;
377 s16 field_width;
378 s16 precision;
379};
380
381static noinline_for_stack
382char *number(char *buf, char *end, unsigned long long num,
383 struct printf_spec spec)
384{
385
386 static const char digits[16] = "0123456789ABCDEF";
387
388 char tmp[66];
389 char sign;
390 char locase;
391 int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
392 int i;
393 bool is_zero = num == 0LL;
394
395
396
397 locase = (spec.flags & SMALL);
398 if (spec.flags & LEFT)
399 spec.flags &= ~ZEROPAD;
400 sign = 0;
401 if (spec.flags & SIGN) {
402 if ((signed long long)num < 0) {
403 sign = '-';
404 num = -(signed long long)num;
405 spec.field_width--;
406 } else if (spec.flags & PLUS) {
407 sign = '+';
408 spec.field_width--;
409 } else if (spec.flags & SPACE) {
410 sign = ' ';
411 spec.field_width--;
412 }
413 }
414 if (need_pfx) {
415 if (spec.base == 16)
416 spec.field_width -= 2;
417 else if (!is_zero)
418 spec.field_width--;
419 }
420
421
422 i = 0;
423 if (num < spec.base)
424 tmp[i++] = digits[num] | locase;
425
426
427
428
429
430 else if (spec.base != 10) {
431 int mask = spec.base - 1;
432 int shift = 3;
433
434 if (spec.base == 16)
435 shift = 4;
436 do {
437 tmp[i++] = (digits[((unsigned char)num) & mask] | locase);
438 num >>= shift;
439 } while (num);
440 } else {
441 i = put_dec(tmp, num) - tmp;
442 }
443
444
445 if (i > spec.precision)
446 spec.precision = i;
447
448 spec.field_width -= spec.precision;
449 if (!(spec.flags & (ZEROPAD+LEFT))) {
450 while (--spec.field_width >= 0) {
451 if (buf < end)
452 *buf = ' ';
453 ++buf;
454 }
455 }
456
457 if (sign) {
458 if (buf < end)
459 *buf = sign;
460 ++buf;
461 }
462
463 if (need_pfx) {
464 if (spec.base == 16 || !is_zero) {
465 if (buf < end)
466 *buf = '0';
467 ++buf;
468 }
469 if (spec.base == 16) {
470 if (buf < end)
471 *buf = ('X' | locase);
472 ++buf;
473 }
474 }
475
476 if (!(spec.flags & LEFT)) {
477 char c = (spec.flags & ZEROPAD) ? '0' : ' ';
478 while (--spec.field_width >= 0) {
479 if (buf < end)
480 *buf = c;
481 ++buf;
482 }
483 }
484
485 while (i <= --spec.precision) {
486 if (buf < end)
487 *buf = '0';
488 ++buf;
489 }
490
491 while (--i >= 0) {
492 if (buf < end)
493 *buf = tmp[i];
494 ++buf;
495 }
496
497 while (--spec.field_width >= 0) {
498 if (buf < end)
499 *buf = ' ';
500 ++buf;
501 }
502
503 return buf;
504}
505
506static noinline_for_stack
507char *string(char *buf, char *end, const char *s, struct printf_spec spec)
508{
509 int len, i;
510
511 if ((unsigned long)s < PAGE_SIZE)
512 s = "(null)";
513
514 len = strnlen(s, spec.precision);
515
516 if (!(spec.flags & LEFT)) {
517 while (len < spec.field_width--) {
518 if (buf < end)
519 *buf = ' ';
520 ++buf;
521 }
522 }
523 for (i = 0; i < len; ++i) {
524 if (buf < end)
525 *buf = *s;
526 ++buf; ++s;
527 }
528 while (len < spec.field_width--) {
529 if (buf < end)
530 *buf = ' ';
531 ++buf;
532 }
533
534 return buf;
535}
536
537static void widen(char *buf, char *end, unsigned len, unsigned spaces)
538{
539 size_t size;
540 if (buf >= end)
541 return;
542 size = end - buf;
543 if (size <= spaces) {
544 memset(buf, ' ', size);
545 return;
546 }
547 if (len) {
548 if (len > size - spaces)
549 len = size - spaces;
550 memmove(buf + spaces, buf, len);
551 }
552 memset(buf, ' ', spaces);
553}
554
555static noinline_for_stack
556char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_spec spec,
557 const char *fmt)
558{
559 const char *array[4], *s;
560 const struct dentry *p;
561 int depth;
562 int i, n;
563
564 switch (fmt[1]) {
565 case '2': case '3': case '4':
566 depth = fmt[1] - '0';
567 break;
568 default:
569 depth = 1;
570 }
571
572 rcu_read_lock();
573 for (i = 0; i < depth; i++, d = p) {
574 p = ACCESS_ONCE(d->d_parent);
575 array[i] = ACCESS_ONCE(d->d_name.name);
576 if (p == d) {
577 if (i)
578 array[i] = "";
579 i++;
580 break;
581 }
582 }
583 s = array[--i];
584 for (n = 0; n != spec.precision; n++, buf++) {
585 char c = *s++;
586 if (!c) {
587 if (!i)
588 break;
589 c = '/';
590 s = array[--i];
591 }
592 if (buf < end)
593 *buf = c;
594 }
595 rcu_read_unlock();
596 if (n < spec.field_width) {
597
598 unsigned spaces = spec.field_width - n;
599 if (!(spec.flags & LEFT)) {
600 widen(buf - n, end, n, spaces);
601 return buf + spaces;
602 }
603 while (spaces--) {
604 if (buf < end)
605 *buf = ' ';
606 ++buf;
607 }
608 }
609 return buf;
610}
611
612static noinline_for_stack
613char *symbol_string(char *buf, char *end, void *ptr,
614 struct printf_spec spec, const char *fmt)
615{
616 unsigned long value;
617#ifdef CONFIG_KALLSYMS
618 char sym[KSYM_SYMBOL_LEN];
619#endif
620
621 if (fmt[1] == 'R')
622 ptr = __builtin_extract_return_addr(ptr);
623 value = (unsigned long)ptr;
624
625#ifdef CONFIG_KALLSYMS
626 if (*fmt == 'B')
627 sprint_backtrace(sym, value);
628 else if (*fmt != 'f' && *fmt != 's')
629 sprint_symbol(sym, value);
630 else
631 sprint_symbol_no_offset(sym, value);
632
633 return string(buf, end, sym, spec);
634#else
635 spec.field_width = 2 * sizeof(void *);
636 spec.flags |= SPECIAL | SMALL | ZEROPAD;
637 spec.base = 16;
638
639 return number(buf, end, value, spec);
640#endif
641}
642
643static noinline_for_stack
644char *resource_string(char *buf, char *end, struct resource *res,
645 struct printf_spec spec, const char *fmt)
646{
647#ifndef IO_RSRC_PRINTK_SIZE
648#define IO_RSRC_PRINTK_SIZE 6
649#endif
650
651#ifndef MEM_RSRC_PRINTK_SIZE
652#define MEM_RSRC_PRINTK_SIZE 10
653#endif
654 static const struct printf_spec io_spec = {
655 .base = 16,
656 .field_width = IO_RSRC_PRINTK_SIZE,
657 .precision = -1,
658 .flags = SPECIAL | SMALL | ZEROPAD,
659 };
660 static const struct printf_spec mem_spec = {
661 .base = 16,
662 .field_width = MEM_RSRC_PRINTK_SIZE,
663 .precision = -1,
664 .flags = SPECIAL | SMALL | ZEROPAD,
665 };
666 static const struct printf_spec bus_spec = {
667 .base = 16,
668 .field_width = 2,
669 .precision = -1,
670 .flags = SMALL | ZEROPAD,
671 };
672 static const struct printf_spec dec_spec = {
673 .base = 10,
674 .precision = -1,
675 .flags = 0,
676 };
677 static const struct printf_spec str_spec = {
678 .field_width = -1,
679 .precision = 10,
680 .flags = LEFT,
681 };
682 static const struct printf_spec flag_spec = {
683 .base = 16,
684 .precision = -1,
685 .flags = SPECIAL | SMALL,
686 };
687
688
689
690#define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4)
691#define FLAG_BUF_SIZE (2 * sizeof(res->flags))
692#define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]")
693#define RAW_BUF_SIZE sizeof("[mem - flags 0x]")
694 char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
695 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
696
697 char *p = sym, *pend = sym + sizeof(sym);
698 int decode = (fmt[0] == 'R') ? 1 : 0;
699 const struct printf_spec *specp;
700
701 *p++ = '[';
702 if (res->flags & IORESOURCE_IO) {
703 p = string(p, pend, "io ", str_spec);
704 specp = &io_spec;
705 } else if (res->flags & IORESOURCE_MEM) {
706 p = string(p, pend, "mem ", str_spec);
707 specp = &mem_spec;
708 } else if (res->flags & IORESOURCE_IRQ) {
709 p = string(p, pend, "irq ", str_spec);
710 specp = &dec_spec;
711 } else if (res->flags & IORESOURCE_DMA) {
712 p = string(p, pend, "dma ", str_spec);
713 specp = &dec_spec;
714 } else if (res->flags & IORESOURCE_BUS) {
715 p = string(p, pend, "bus ", str_spec);
716 specp = &bus_spec;
717 } else {
718 p = string(p, pend, "??? ", str_spec);
719 specp = &mem_spec;
720 decode = 0;
721 }
722 if (decode && res->flags & IORESOURCE_UNSET) {
723 p = string(p, pend, "size ", str_spec);
724 p = number(p, pend, resource_size(res), *specp);
725 } else {
726 p = number(p, pend, res->start, *specp);
727 if (res->start != res->end) {
728 *p++ = '-';
729 p = number(p, pend, res->end, *specp);
730 }
731 }
732 if (decode) {
733 if (res->flags & IORESOURCE_MEM_64)
734 p = string(p, pend, " 64bit", str_spec);
735 if (res->flags & IORESOURCE_PREFETCH)
736 p = string(p, pend, " pref", str_spec);
737 if (res->flags & IORESOURCE_WINDOW)
738 p = string(p, pend, " window", str_spec);
739 if (res->flags & IORESOURCE_DISABLED)
740 p = string(p, pend, " disabled", str_spec);
741 } else {
742 p = string(p, pend, " flags ", str_spec);
743 p = number(p, pend, res->flags, flag_spec);
744 }
745 *p++ = ']';
746 *p = '\0';
747
748 return string(buf, end, sym, spec);
749}
750
751static noinline_for_stack
752char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
753 const char *fmt)
754{
755 int i, len = 1;
756
757 char separator;
758
759 if (spec.field_width == 0)
760
761 return buf;
762
763 if (ZERO_OR_NULL_PTR(addr))
764
765 return string(buf, end, NULL, spec);
766
767 switch (fmt[1]) {
768 case 'C':
769 separator = ':';
770 break;
771 case 'D':
772 separator = '-';
773 break;
774 case 'N':
775 separator = 0;
776 break;
777 default:
778 separator = ' ';
779 break;
780 }
781
782 if (spec.field_width > 0)
783 len = min_t(int, spec.field_width, 64);
784
785 for (i = 0; i < len && buf < end - 1; i++) {
786 buf = hex_byte_pack(buf, addr[i]);
787
788 if (buf < end && separator && i != len - 1)
789 *buf++ = separator;
790 }
791
792 return buf;
793}
794
795static noinline_for_stack
796char *mac_address_string(char *buf, char *end, u8 *addr,
797 struct printf_spec spec, const char *fmt)
798{
799 char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
800 char *p = mac_addr;
801 int i;
802 char separator;
803 bool reversed = false;
804
805 switch (fmt[1]) {
806 case 'F':
807 separator = '-';
808 break;
809
810 case 'R':
811 reversed = true;
812
813
814 default:
815 separator = ':';
816 break;
817 }
818
819 for (i = 0; i < 6; i++) {
820 if (reversed)
821 p = hex_byte_pack(p, addr[5 - i]);
822 else
823 p = hex_byte_pack(p, addr[i]);
824
825 if (fmt[0] == 'M' && i != 5)
826 *p++ = separator;
827 }
828 *p = '\0';
829
830 return string(buf, end, mac_addr, spec);
831}
832
833static noinline_for_stack
834char *ip4_string(char *p, const u8 *addr, const char *fmt)
835{
836 int i;
837 bool leading_zeros = (fmt[0] == 'i');
838 int index;
839 int step;
840
841 switch (fmt[2]) {
842 case 'h':
843#ifdef __BIG_ENDIAN
844 index = 0;
845 step = 1;
846#else
847 index = 3;
848 step = -1;
849#endif
850 break;
851 case 'l':
852 index = 3;
853 step = -1;
854 break;
855 case 'n':
856 case 'b':
857 default:
858 index = 0;
859 step = 1;
860 break;
861 }
862 for (i = 0; i < 4; i++) {
863 char temp[3];
864 int digits = put_dec_trunc8(temp, addr[index]) - temp;
865 if (leading_zeros) {
866 if (digits < 3)
867 *p++ = '0';
868 if (digits < 2)
869 *p++ = '0';
870 }
871
872 while (digits--)
873 *p++ = temp[digits];
874 if (i < 3)
875 *p++ = '.';
876 index += step;
877 }
878 *p = '\0';
879
880 return p;
881}
882
883static noinline_for_stack
884char *ip6_compressed_string(char *p, const char *addr)
885{
886 int i, j, range;
887 unsigned char zerolength[8];
888 int longest = 1;
889 int colonpos = -1;
890 u16 word;
891 u8 hi, lo;
892 bool needcolon = false;
893 bool useIPv4;
894 struct in6_addr in6;
895
896 memcpy(&in6, addr, sizeof(struct in6_addr));
897
898 useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
899
900 memset(zerolength, 0, sizeof(zerolength));
901
902 if (useIPv4)
903 range = 6;
904 else
905 range = 8;
906
907
908 for (i = 0; i < range; i++) {
909 for (j = i; j < range; j++) {
910 if (in6.s6_addr16[j] != 0)
911 break;
912 zerolength[i]++;
913 }
914 }
915 for (i = 0; i < range; i++) {
916 if (zerolength[i] > longest) {
917 longest = zerolength[i];
918 colonpos = i;
919 }
920 }
921 if (longest == 1)
922 colonpos = -1;
923
924
925 for (i = 0; i < range; i++) {
926 if (i == colonpos) {
927 if (needcolon || i == 0)
928 *p++ = ':';
929 *p++ = ':';
930 needcolon = false;
931 i += longest - 1;
932 continue;
933 }
934 if (needcolon) {
935 *p++ = ':';
936 needcolon = false;
937 }
938
939 word = ntohs(in6.s6_addr16[i]);
940 hi = word >> 8;
941 lo = word & 0xff;
942 if (hi) {
943 if (hi > 0x0f)
944 p = hex_byte_pack(p, hi);
945 else
946 *p++ = hex_asc_lo(hi);
947 p = hex_byte_pack(p, lo);
948 }
949 else if (lo > 0x0f)
950 p = hex_byte_pack(p, lo);
951 else
952 *p++ = hex_asc_lo(lo);
953 needcolon = true;
954 }
955
956 if (useIPv4) {
957 if (needcolon)
958 *p++ = ':';
959 p = ip4_string(p, &in6.s6_addr[12], "I4");
960 }
961 *p = '\0';
962
963 return p;
964}
965
966static noinline_for_stack
967char *ip6_string(char *p, const char *addr, const char *fmt)
968{
969 int i;
970
971 for (i = 0; i < 8; i++) {
972 p = hex_byte_pack(p, *addr++);
973 p = hex_byte_pack(p, *addr++);
974 if (fmt[0] == 'I' && i != 7)
975 *p++ = ':';
976 }
977 *p = '\0';
978
979 return p;
980}
981
982static noinline_for_stack
983char *ip6_addr_string(char *buf, char *end, const u8 *addr,
984 struct printf_spec spec, const char *fmt)
985{
986 char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
987
988 if (fmt[0] == 'I' && fmt[2] == 'c')
989 ip6_compressed_string(ip6_addr, addr);
990 else
991 ip6_string(ip6_addr, addr, fmt);
992
993 return string(buf, end, ip6_addr, spec);
994}
995
996static noinline_for_stack
997char *ip4_addr_string(char *buf, char *end, const u8 *addr,
998 struct printf_spec spec, const char *fmt)
999{
1000 char ip4_addr[sizeof("255.255.255.255")];
1001
1002 ip4_string(ip4_addr, addr, fmt);
1003
1004 return string(buf, end, ip4_addr, spec);
1005}
1006
1007static noinline_for_stack
1008char *ip6_addr_string_sa(char *buf, char *end, const struct sockaddr_in6 *sa,
1009 struct printf_spec spec, const char *fmt)
1010{
1011 bool have_p = false, have_s = false, have_f = false, have_c = false;
1012 char ip6_addr[sizeof("[xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255]") +
1013 sizeof(":12345") + sizeof("/123456789") +
1014 sizeof("%1234567890")];
1015 char *p = ip6_addr, *pend = ip6_addr + sizeof(ip6_addr);
1016 const u8 *addr = (const u8 *) &sa->sin6_addr;
1017 char fmt6[2] = { fmt[0], '6' };
1018 u8 off = 0;
1019
1020 fmt++;
1021 while (isalpha(*++fmt)) {
1022 switch (*fmt) {
1023 case 'p':
1024 have_p = true;
1025 break;
1026 case 'f':
1027 have_f = true;
1028 break;
1029 case 's':
1030 have_s = true;
1031 break;
1032 case 'c':
1033 have_c = true;
1034 break;
1035 }
1036 }
1037
1038 if (have_p || have_s || have_f) {
1039 *p = '[';
1040 off = 1;
1041 }
1042
1043 if (fmt6[0] == 'I' && have_c)
1044 p = ip6_compressed_string(ip6_addr + off, addr);
1045 else
1046 p = ip6_string(ip6_addr + off, addr, fmt6);
1047
1048 if (have_p || have_s || have_f)
1049 *p++ = ']';
1050
1051 if (have_p) {
1052 *p++ = ':';
1053 p = number(p, pend, ntohs(sa->sin6_port), spec);
1054 }
1055 if (have_f) {
1056 *p++ = '/';
1057 p = number(p, pend, ntohl(sa->sin6_flowinfo &
1058 IPV6_FLOWINFO_MASK), spec);
1059 }
1060 if (have_s) {
1061 *p++ = '%';
1062 p = number(p, pend, sa->sin6_scope_id, spec);
1063 }
1064 *p = '\0';
1065
1066 return string(buf, end, ip6_addr, spec);
1067}
1068
1069static noinline_for_stack
1070char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
1071 struct printf_spec spec, const char *fmt)
1072{
1073 bool have_p = false;
1074 char *p, ip4_addr[sizeof("255.255.255.255") + sizeof(":12345")];
1075 char *pend = ip4_addr + sizeof(ip4_addr);
1076 const u8 *addr = (const u8 *) &sa->sin_addr.s_addr;
1077 char fmt4[3] = { fmt[0], '4', 0 };
1078
1079 fmt++;
1080 while (isalpha(*++fmt)) {
1081 switch (*fmt) {
1082 case 'p':
1083 have_p = true;
1084 break;
1085 case 'h':
1086 case 'l':
1087 case 'n':
1088 case 'b':
1089 fmt4[2] = *fmt;
1090 break;
1091 }
1092 }
1093
1094 p = ip4_string(ip4_addr, addr, fmt4);
1095 if (have_p) {
1096 *p++ = ':';
1097 p = number(p, pend, ntohs(sa->sin_port), spec);
1098 }
1099 *p = '\0';
1100
1101 return string(buf, end, ip4_addr, spec);
1102}
1103
1104static noinline_for_stack
1105char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
1106 const char *fmt)
1107{
1108 bool found = true;
1109 int count = 1;
1110 unsigned int flags = 0;
1111 int len;
1112
1113 if (spec.field_width == 0)
1114 return buf;
1115
1116 if (ZERO_OR_NULL_PTR(addr))
1117 return string(buf, end, NULL, spec);
1118
1119
1120 do {
1121 switch (fmt[count++]) {
1122 case 'a':
1123 flags |= ESCAPE_ANY;
1124 break;
1125 case 'c':
1126 flags |= ESCAPE_SPECIAL;
1127 break;
1128 case 'h':
1129 flags |= ESCAPE_HEX;
1130 break;
1131 case 'n':
1132 flags |= ESCAPE_NULL;
1133 break;
1134 case 'o':
1135 flags |= ESCAPE_OCTAL;
1136 break;
1137 case 'p':
1138 flags |= ESCAPE_NP;
1139 break;
1140 case 's':
1141 flags |= ESCAPE_SPACE;
1142 break;
1143 default:
1144 found = false;
1145 break;
1146 }
1147 } while (found);
1148
1149 if (!flags)
1150 flags = ESCAPE_ANY_NP;
1151
1152 len = spec.field_width < 0 ? 1 : spec.field_width;
1153
1154
1155 string_escape_mem(addr, len, &buf, end - buf, flags, NULL);
1156
1157 return buf;
1158}
1159
1160static noinline_for_stack
1161char *uuid_string(char *buf, char *end, const u8 *addr,
1162 struct printf_spec spec, const char *fmt)
1163{
1164 char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
1165 char *p = uuid;
1166 int i;
1167 static const u8 be[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
1168 static const u8 le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
1169 const u8 *index = be;
1170 bool uc = false;
1171
1172 switch (*(++fmt)) {
1173 case 'L':
1174 uc = true;
1175 case 'l':
1176 index = le;
1177 break;
1178 case 'B':
1179 uc = true;
1180 break;
1181 }
1182
1183 for (i = 0; i < 16; i++) {
1184 p = hex_byte_pack(p, addr[index[i]]);
1185 switch (i) {
1186 case 3:
1187 case 5:
1188 case 7:
1189 case 9:
1190 *p++ = '-';
1191 break;
1192 }
1193 }
1194
1195 *p = 0;
1196
1197 if (uc) {
1198 p = uuid;
1199 do {
1200 *p = toupper(*p);
1201 } while (*(++p));
1202 }
1203
1204 return string(buf, end, uuid, spec);
1205}
1206
1207static
1208char *netdev_feature_string(char *buf, char *end, const u8 *addr,
1209 struct printf_spec spec)
1210{
1211 spec.flags |= SPECIAL | SMALL | ZEROPAD;
1212 if (spec.field_width == -1)
1213 spec.field_width = 2 + 2 * sizeof(netdev_features_t);
1214 spec.base = 16;
1215
1216 return number(buf, end, *(const netdev_features_t *)addr, spec);
1217}
1218
1219static noinline_for_stack
1220char *address_val(char *buf, char *end, const void *addr,
1221 struct printf_spec spec, const char *fmt)
1222{
1223 unsigned long long num;
1224
1225 spec.flags |= SPECIAL | SMALL | ZEROPAD;
1226 spec.base = 16;
1227
1228 switch (fmt[1]) {
1229 case 'd':
1230 num = *(const dma_addr_t *)addr;
1231 spec.field_width = sizeof(dma_addr_t) * 2 + 2;
1232 break;
1233 case 'p':
1234 default:
1235 num = *(const phys_addr_t *)addr;
1236 spec.field_width = sizeof(phys_addr_t) * 2 + 2;
1237 break;
1238 }
1239
1240 return number(buf, end, num, spec);
1241}
1242
1243int kptr_restrict __read_mostly;
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326static noinline_for_stack
1327char *pointer(const char *fmt, char *buf, char *end, void *ptr,
1328 struct printf_spec spec)
1329{
1330 int default_width = 2 * sizeof(void *) + (spec.flags & SPECIAL ? 2 : 0);
1331
1332 if (!ptr && *fmt != 'K') {
1333
1334
1335
1336
1337 if (spec.field_width == -1)
1338 spec.field_width = default_width;
1339 return string(buf, end, "(null)", spec);
1340 }
1341
1342 switch (*fmt) {
1343 case 'F':
1344 case 'f':
1345 ptr = dereference_function_descriptor(ptr);
1346
1347 case 'S':
1348 case 's':
1349 case 'B':
1350 return symbol_string(buf, end, ptr, spec, fmt);
1351 case 'R':
1352 case 'r':
1353 return resource_string(buf, end, ptr, spec, fmt);
1354 case 'h':
1355 return hex_string(buf, end, ptr, spec, fmt);
1356 case 'M':
1357 case 'm':
1358
1359
1360 return mac_address_string(buf, end, ptr, spec, fmt);
1361 case 'I':
1362
1363
1364
1365
1366 case 'i':
1367
1368
1369
1370 switch (fmt[1]) {
1371 case '6':
1372 return ip6_addr_string(buf, end, ptr, spec, fmt);
1373 case '4':
1374 return ip4_addr_string(buf, end, ptr, spec, fmt);
1375 case 'S': {
1376 const union {
1377 struct sockaddr raw;
1378 struct sockaddr_in v4;
1379 struct sockaddr_in6 v6;
1380 } *sa = ptr;
1381
1382 switch (sa->raw.sa_family) {
1383 case AF_INET:
1384 return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt);
1385 case AF_INET6:
1386 return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
1387 default:
1388 return string(buf, end, "(invalid address)", spec);
1389 }}
1390 }
1391 break;
1392 case 'E':
1393 return escaped_string(buf, end, ptr, spec, fmt);
1394 case 'U':
1395 return uuid_string(buf, end, ptr, spec, fmt);
1396 case 'V':
1397 {
1398 va_list va;
1399
1400 va_copy(va, *((struct va_format *)ptr)->va);
1401 buf += vsnprintf(buf, end > buf ? end - buf : 0,
1402 ((struct va_format *)ptr)->fmt, va);
1403 va_end(va);
1404 return buf;
1405 }
1406 case 'K':
1407
1408
1409
1410
1411 if (kptr_restrict && (in_irq() || in_serving_softirq() ||
1412 in_nmi())) {
1413 if (spec.field_width == -1)
1414 spec.field_width = default_width;
1415 return string(buf, end, "pK-error", spec);
1416 }
1417
1418 switch (kptr_restrict) {
1419 case 0:
1420
1421 break;
1422 case 1: {
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432 const struct cred *cred = current_cred();
1433
1434 if (!has_capability_noaudit(current, CAP_SYSLOG) ||
1435 !uid_eq(cred->euid, cred->uid) ||
1436 !gid_eq(cred->egid, cred->gid))
1437 ptr = NULL;
1438 break;
1439 }
1440 case 2:
1441 default:
1442
1443 ptr = NULL;
1444 break;
1445 }
1446 break;
1447
1448 case 'N':
1449 switch (fmt[1]) {
1450 case 'F':
1451 return netdev_feature_string(buf, end, ptr, spec);
1452 }
1453 break;
1454 case 'a':
1455 return address_val(buf, end, ptr, spec, fmt);
1456 case 'd':
1457 return dentry_name(buf, end, ptr, spec, fmt);
1458 case 'D':
1459 return dentry_name(buf, end,
1460 ((const struct file *)ptr)->f_path.dentry,
1461 spec, fmt);
1462 }
1463 spec.flags |= SMALL;
1464 if (spec.field_width == -1) {
1465 spec.field_width = default_width;
1466 spec.flags |= ZEROPAD;
1467 }
1468 spec.base = 16;
1469
1470 return number(buf, end, (unsigned long) ptr, spec);
1471}
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493static noinline_for_stack
1494int format_decode(const char *fmt, struct printf_spec *spec)
1495{
1496 const char *start = fmt;
1497
1498
1499 if (spec->type == FORMAT_TYPE_WIDTH) {
1500 if (spec->field_width < 0) {
1501 spec->field_width = -spec->field_width;
1502 spec->flags |= LEFT;
1503 }
1504 spec->type = FORMAT_TYPE_NONE;
1505 goto precision;
1506 }
1507
1508
1509 if (spec->type == FORMAT_TYPE_PRECISION) {
1510 if (spec->precision < 0)
1511 spec->precision = 0;
1512
1513 spec->type = FORMAT_TYPE_NONE;
1514 goto qualifier;
1515 }
1516
1517
1518 spec->type = FORMAT_TYPE_NONE;
1519
1520 for (; *fmt ; ++fmt) {
1521 if (*fmt == '%')
1522 break;
1523 }
1524
1525
1526 if (fmt != start || !*fmt)
1527 return fmt - start;
1528
1529
1530 spec->flags = 0;
1531
1532 while (1) {
1533 bool found = true;
1534
1535 ++fmt;
1536
1537 switch (*fmt) {
1538 case '-': spec->flags |= LEFT; break;
1539 case '+': spec->flags |= PLUS; break;
1540 case ' ': spec->flags |= SPACE; break;
1541 case '#': spec->flags |= SPECIAL; break;
1542 case '0': spec->flags |= ZEROPAD; break;
1543 default: found = false;
1544 }
1545
1546 if (!found)
1547 break;
1548 }
1549
1550
1551 spec->field_width = -1;
1552
1553 if (isdigit(*fmt))
1554 spec->field_width = skip_atoi(&fmt);
1555 else if (*fmt == '*') {
1556
1557 spec->type = FORMAT_TYPE_WIDTH;
1558 return ++fmt - start;
1559 }
1560
1561precision:
1562
1563 spec->precision = -1;
1564 if (*fmt == '.') {
1565 ++fmt;
1566 if (isdigit(*fmt)) {
1567 spec->precision = skip_atoi(&fmt);
1568 if (spec->precision < 0)
1569 spec->precision = 0;
1570 } else if (*fmt == '*') {
1571
1572 spec->type = FORMAT_TYPE_PRECISION;
1573 return ++fmt - start;
1574 }
1575 }
1576
1577qualifier:
1578
1579 spec->qualifier = -1;
1580 if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
1581 _tolower(*fmt) == 'z' || *fmt == 't') {
1582 spec->qualifier = *fmt++;
1583 if (unlikely(spec->qualifier == *fmt)) {
1584 if (spec->qualifier == 'l') {
1585 spec->qualifier = 'L';
1586 ++fmt;
1587 } else if (spec->qualifier == 'h') {
1588 spec->qualifier = 'H';
1589 ++fmt;
1590 }
1591 }
1592 }
1593
1594
1595 spec->base = 10;
1596 switch (*fmt) {
1597 case 'c':
1598 spec->type = FORMAT_TYPE_CHAR;
1599 return ++fmt - start;
1600
1601 case 's':
1602 spec->type = FORMAT_TYPE_STR;
1603 return ++fmt - start;
1604
1605 case 'p':
1606 spec->type = FORMAT_TYPE_PTR;
1607 return fmt - start;
1608
1609
1610 case '%':
1611 spec->type = FORMAT_TYPE_PERCENT_CHAR;
1612 return ++fmt - start;
1613
1614
1615 case 'o':
1616 spec->base = 8;
1617 break;
1618
1619 case 'x':
1620 spec->flags |= SMALL;
1621
1622 case 'X':
1623 spec->base = 16;
1624 break;
1625
1626 case 'd':
1627 case 'i':
1628 spec->flags |= SIGN;
1629 case 'u':
1630 break;
1631
1632 case 'n':
1633
1634
1635
1636
1637
1638 WARN_ONCE(1, "Please remove ignored %%n in '%s'\n", fmt);
1639
1640
1641 default:
1642 spec->type = FORMAT_TYPE_INVALID;
1643 return fmt - start;
1644 }
1645
1646 if (spec->qualifier == 'L')
1647 spec->type = FORMAT_TYPE_LONG_LONG;
1648 else if (spec->qualifier == 'l') {
1649 if (spec->flags & SIGN)
1650 spec->type = FORMAT_TYPE_LONG;
1651 else
1652 spec->type = FORMAT_TYPE_ULONG;
1653 } else if (_tolower(spec->qualifier) == 'z') {
1654 spec->type = FORMAT_TYPE_SIZE_T;
1655 } else if (spec->qualifier == 't') {
1656 spec->type = FORMAT_TYPE_PTRDIFF;
1657 } else if (spec->qualifier == 'H') {
1658 if (spec->flags & SIGN)
1659 spec->type = FORMAT_TYPE_BYTE;
1660 else
1661 spec->type = FORMAT_TYPE_UBYTE;
1662 } else if (spec->qualifier == 'h') {
1663 if (spec->flags & SIGN)
1664 spec->type = FORMAT_TYPE_SHORT;
1665 else
1666 spec->type = FORMAT_TYPE_USHORT;
1667 } else {
1668 if (spec->flags & SIGN)
1669 spec->type = FORMAT_TYPE_INT;
1670 else
1671 spec->type = FORMAT_TYPE_UINT;
1672 }
1673
1674 return ++fmt - start;
1675}
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1724{
1725 unsigned long long num;
1726 char *str, *end;
1727 struct printf_spec spec = {0};
1728
1729
1730
1731 if (WARN_ON_ONCE((int) size < 0))
1732 return 0;
1733
1734 str = buf;
1735 end = buf + size;
1736
1737
1738 if (end < buf) {
1739 end = ((void *)-1);
1740 size = end - buf;
1741 }
1742
1743 while (*fmt) {
1744 const char *old_fmt = fmt;
1745 int read = format_decode(fmt, &spec);
1746
1747 fmt += read;
1748
1749 switch (spec.type) {
1750 case FORMAT_TYPE_NONE: {
1751 int copy = read;
1752 if (str < end) {
1753 if (copy > end - str)
1754 copy = end - str;
1755 memcpy(str, old_fmt, copy);
1756 }
1757 str += read;
1758 break;
1759 }
1760
1761 case FORMAT_TYPE_WIDTH:
1762 spec.field_width = va_arg(args, int);
1763 break;
1764
1765 case FORMAT_TYPE_PRECISION:
1766 spec.precision = va_arg(args, int);
1767 break;
1768
1769 case FORMAT_TYPE_CHAR: {
1770 char c;
1771
1772 if (!(spec.flags & LEFT)) {
1773 while (--spec.field_width > 0) {
1774 if (str < end)
1775 *str = ' ';
1776 ++str;
1777
1778 }
1779 }
1780 c = (unsigned char) va_arg(args, int);
1781 if (str < end)
1782 *str = c;
1783 ++str;
1784 while (--spec.field_width > 0) {
1785 if (str < end)
1786 *str = ' ';
1787 ++str;
1788 }
1789 break;
1790 }
1791
1792 case FORMAT_TYPE_STR:
1793 str = string(str, end, va_arg(args, char *), spec);
1794 break;
1795
1796 case FORMAT_TYPE_PTR:
1797 str = pointer(fmt+1, str, end, va_arg(args, void *),
1798 spec);
1799 while (isalnum(*fmt))
1800 fmt++;
1801 break;
1802
1803 case FORMAT_TYPE_PERCENT_CHAR:
1804 if (str < end)
1805 *str = '%';
1806 ++str;
1807 break;
1808
1809 case FORMAT_TYPE_INVALID:
1810 if (str < end)
1811 *str = '%';
1812 ++str;
1813 break;
1814
1815 default:
1816 switch (spec.type) {
1817 case FORMAT_TYPE_LONG_LONG:
1818 num = va_arg(args, long long);
1819 break;
1820 case FORMAT_TYPE_ULONG:
1821 num = va_arg(args, unsigned long);
1822 break;
1823 case FORMAT_TYPE_LONG:
1824 num = va_arg(args, long);
1825 break;
1826 case FORMAT_TYPE_SIZE_T:
1827 if (spec.flags & SIGN)
1828 num = va_arg(args, ssize_t);
1829 else
1830 num = va_arg(args, size_t);
1831 break;
1832 case FORMAT_TYPE_PTRDIFF:
1833 num = va_arg(args, ptrdiff_t);
1834 break;
1835 case FORMAT_TYPE_UBYTE:
1836 num = (unsigned char) va_arg(args, int);
1837 break;
1838 case FORMAT_TYPE_BYTE:
1839 num = (signed char) va_arg(args, int);
1840 break;
1841 case FORMAT_TYPE_USHORT:
1842 num = (unsigned short) va_arg(args, int);
1843 break;
1844 case FORMAT_TYPE_SHORT:
1845 num = (short) va_arg(args, int);
1846 break;
1847 case FORMAT_TYPE_INT:
1848 num = (int) va_arg(args, int);
1849 break;
1850 default:
1851 num = va_arg(args, unsigned int);
1852 }
1853
1854 str = number(str, end, num, spec);
1855 }
1856 }
1857
1858 if (size > 0) {
1859 if (str < end)
1860 *str = '\0';
1861 else
1862 end[-1] = '\0';
1863 }
1864
1865
1866 return str-buf;
1867
1868}
1869EXPORT_SYMBOL(vsnprintf);
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
1887{
1888 int i;
1889
1890 i = vsnprintf(buf, size, fmt, args);
1891
1892 if (likely(i < size))
1893 return i;
1894 if (size != 0)
1895 return size - 1;
1896 return 0;
1897}
1898EXPORT_SYMBOL(vscnprintf);
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914int snprintf(char *buf, size_t size, const char *fmt, ...)
1915{
1916 va_list args;
1917 int i;
1918
1919 va_start(args, fmt);
1920 i = vsnprintf(buf, size, fmt, args);
1921 va_end(args);
1922
1923 return i;
1924}
1925EXPORT_SYMBOL(snprintf);
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938int scnprintf(char *buf, size_t size, const char *fmt, ...)
1939{
1940 va_list args;
1941 int i;
1942
1943 va_start(args, fmt);
1944 i = vscnprintf(buf, size, fmt, args);
1945 va_end(args);
1946
1947 return i;
1948}
1949EXPORT_SYMBOL(scnprintf);
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965int vsprintf(char *buf, const char *fmt, va_list args)
1966{
1967 return vsnprintf(buf, INT_MAX, fmt, args);
1968}
1969EXPORT_SYMBOL(vsprintf);
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983int sprintf(char *buf, const char *fmt, ...)
1984{
1985 va_list args;
1986 int i;
1987
1988 va_start(args, fmt);
1989 i = vsnprintf(buf, INT_MAX, fmt, args);
1990 va_end(args);
1991
1992 return i;
1993}
1994EXPORT_SYMBOL(sprintf);
1995
1996#ifdef CONFIG_BINARY_PRINTF
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
2021{
2022 struct printf_spec spec = {0};
2023 char *str, *end;
2024
2025 str = (char *)bin_buf;
2026 end = (char *)(bin_buf + size);
2027
2028#define save_arg(type) \
2029do { \
2030 if (sizeof(type) == 8) { \
2031 unsigned long long value; \
2032 str = PTR_ALIGN(str, sizeof(u32)); \
2033 value = va_arg(args, unsigned long long); \
2034 if (str + sizeof(type) <= end) { \
2035 *(u32 *)str = *(u32 *)&value; \
2036 *(u32 *)(str + 4) = *((u32 *)&value + 1); \
2037 } \
2038 } else { \
2039 unsigned long value; \
2040 str = PTR_ALIGN(str, sizeof(type)); \
2041 value = va_arg(args, int); \
2042 if (str + sizeof(type) <= end) \
2043 *(typeof(type) *)str = (type)value; \
2044 } \
2045 str += sizeof(type); \
2046} while (0)
2047
2048 while (*fmt) {
2049 int read = format_decode(fmt, &spec);
2050
2051 fmt += read;
2052
2053 switch (spec.type) {
2054 case FORMAT_TYPE_NONE:
2055 case FORMAT_TYPE_INVALID:
2056 case FORMAT_TYPE_PERCENT_CHAR:
2057 break;
2058
2059 case FORMAT_TYPE_WIDTH:
2060 case FORMAT_TYPE_PRECISION:
2061 save_arg(int);
2062 break;
2063
2064 case FORMAT_TYPE_CHAR:
2065 save_arg(char);
2066 break;
2067
2068 case FORMAT_TYPE_STR: {
2069 const char *save_str = va_arg(args, char *);
2070 size_t len;
2071
2072 if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
2073 || (unsigned long)save_str < PAGE_SIZE)
2074 save_str = "(null)";
2075 len = strlen(save_str) + 1;
2076 if (str + len < end)
2077 memcpy(str, save_str, len);
2078 str += len;
2079 break;
2080 }
2081
2082 case FORMAT_TYPE_PTR:
2083 save_arg(void *);
2084
2085 while (isalnum(*fmt))
2086 fmt++;
2087 break;
2088
2089 default:
2090 switch (spec.type) {
2091
2092 case FORMAT_TYPE_LONG_LONG:
2093 save_arg(long long);
2094 break;
2095 case FORMAT_TYPE_ULONG:
2096 case FORMAT_TYPE_LONG:
2097 save_arg(unsigned long);
2098 break;
2099 case FORMAT_TYPE_SIZE_T:
2100 save_arg(size_t);
2101 break;
2102 case FORMAT_TYPE_PTRDIFF:
2103 save_arg(ptrdiff_t);
2104 break;
2105 case FORMAT_TYPE_UBYTE:
2106 case FORMAT_TYPE_BYTE:
2107 save_arg(char);
2108 break;
2109 case FORMAT_TYPE_USHORT:
2110 case FORMAT_TYPE_SHORT:
2111 save_arg(short);
2112 break;
2113 default:
2114 save_arg(int);
2115 }
2116 }
2117 }
2118
2119 return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
2120#undef save_arg
2121}
2122EXPORT_SYMBOL_GPL(vbin_printf);
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
2147{
2148 struct printf_spec spec = {0};
2149 char *str, *end;
2150 const char *args = (const char *)bin_buf;
2151
2152 if (WARN_ON_ONCE((int) size < 0))
2153 return 0;
2154
2155 str = buf;
2156 end = buf + size;
2157
2158#define get_arg(type) \
2159({ \
2160 typeof(type) value; \
2161 if (sizeof(type) == 8) { \
2162 args = PTR_ALIGN(args, sizeof(u32)); \
2163 *(u32 *)&value = *(u32 *)args; \
2164 *((u32 *)&value + 1) = *(u32 *)(args + 4); \
2165 } else { \
2166 args = PTR_ALIGN(args, sizeof(type)); \
2167 value = *(typeof(type) *)args; \
2168 } \
2169 args += sizeof(type); \
2170 value; \
2171})
2172
2173
2174 if (end < buf) {
2175 end = ((void *)-1);
2176 size = end - buf;
2177 }
2178
2179 while (*fmt) {
2180 const char *old_fmt = fmt;
2181 int read = format_decode(fmt, &spec);
2182
2183 fmt += read;
2184
2185 switch (spec.type) {
2186 case FORMAT_TYPE_NONE: {
2187 int copy = read;
2188 if (str < end) {
2189 if (copy > end - str)
2190 copy = end - str;
2191 memcpy(str, old_fmt, copy);
2192 }
2193 str += read;
2194 break;
2195 }
2196
2197 case FORMAT_TYPE_WIDTH:
2198 spec.field_width = get_arg(int);
2199 break;
2200
2201 case FORMAT_TYPE_PRECISION:
2202 spec.precision = get_arg(int);
2203 break;
2204
2205 case FORMAT_TYPE_CHAR: {
2206 char c;
2207
2208 if (!(spec.flags & LEFT)) {
2209 while (--spec.field_width > 0) {
2210 if (str < end)
2211 *str = ' ';
2212 ++str;
2213 }
2214 }
2215 c = (unsigned char) get_arg(char);
2216 if (str < end)
2217 *str = c;
2218 ++str;
2219 while (--spec.field_width > 0) {
2220 if (str < end)
2221 *str = ' ';
2222 ++str;
2223 }
2224 break;
2225 }
2226
2227 case FORMAT_TYPE_STR: {
2228 const char *str_arg = args;
2229 args += strlen(str_arg) + 1;
2230 str = string(str, end, (char *)str_arg, spec);
2231 break;
2232 }
2233
2234 case FORMAT_TYPE_PTR:
2235 str = pointer(fmt+1, str, end, get_arg(void *), spec);
2236 while (isalnum(*fmt))
2237 fmt++;
2238 break;
2239
2240 case FORMAT_TYPE_PERCENT_CHAR:
2241 case FORMAT_TYPE_INVALID:
2242 if (str < end)
2243 *str = '%';
2244 ++str;
2245 break;
2246
2247 default: {
2248 unsigned long long num;
2249
2250 switch (spec.type) {
2251
2252 case FORMAT_TYPE_LONG_LONG:
2253 num = get_arg(long long);
2254 break;
2255 case FORMAT_TYPE_ULONG:
2256 case FORMAT_TYPE_LONG:
2257 num = get_arg(unsigned long);
2258 break;
2259 case FORMAT_TYPE_SIZE_T:
2260 num = get_arg(size_t);
2261 break;
2262 case FORMAT_TYPE_PTRDIFF:
2263 num = get_arg(ptrdiff_t);
2264 break;
2265 case FORMAT_TYPE_UBYTE:
2266 num = get_arg(unsigned char);
2267 break;
2268 case FORMAT_TYPE_BYTE:
2269 num = get_arg(signed char);
2270 break;
2271 case FORMAT_TYPE_USHORT:
2272 num = get_arg(unsigned short);
2273 break;
2274 case FORMAT_TYPE_SHORT:
2275 num = get_arg(short);
2276 break;
2277 case FORMAT_TYPE_UINT:
2278 num = get_arg(unsigned int);
2279 break;
2280 default:
2281 num = get_arg(int);
2282 }
2283
2284 str = number(str, end, num, spec);
2285 }
2286 }
2287 }
2288
2289 if (size > 0) {
2290 if (str < end)
2291 *str = '\0';
2292 else
2293 end[-1] = '\0';
2294 }
2295
2296#undef get_arg
2297
2298
2299 return str - buf;
2300}
2301EXPORT_SYMBOL_GPL(bstr_printf);
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
2314{
2315 va_list args;
2316 int ret;
2317
2318 va_start(args, fmt);
2319 ret = vbin_printf(bin_buf, size, fmt, args);
2320 va_end(args);
2321
2322 return ret;
2323}
2324EXPORT_SYMBOL_GPL(bprintf);
2325
2326#endif
2327
2328
2329
2330
2331
2332
2333
2334int vsscanf(const char *buf, const char *fmt, va_list args)
2335{
2336 const char *str = buf;
2337 char *next;
2338 char digit;
2339 int num = 0;
2340 u8 qualifier;
2341 unsigned int base;
2342 union {
2343 long long s;
2344 unsigned long long u;
2345 } val;
2346 s16 field_width;
2347 bool is_sign;
2348
2349 while (*fmt) {
2350
2351
2352
2353
2354 if (isspace(*fmt)) {
2355 fmt = skip_spaces(++fmt);
2356 str = skip_spaces(str);
2357 }
2358
2359
2360 if (*fmt != '%' && *fmt) {
2361 if (*fmt++ != *str++)
2362 break;
2363 continue;
2364 }
2365
2366 if (!*fmt)
2367 break;
2368 ++fmt;
2369
2370
2371
2372
2373 if (*fmt == '*') {
2374 if (!*str)
2375 break;
2376 while (!isspace(*fmt) && *fmt != '%' && *fmt)
2377 fmt++;
2378 while (!isspace(*str) && *str)
2379 str++;
2380 continue;
2381 }
2382
2383
2384 field_width = -1;
2385 if (isdigit(*fmt)) {
2386 field_width = skip_atoi(&fmt);
2387 if (field_width <= 0)
2388 break;
2389 }
2390
2391
2392 qualifier = -1;
2393 if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
2394 _tolower(*fmt) == 'z') {
2395 qualifier = *fmt++;
2396 if (unlikely(qualifier == *fmt)) {
2397 if (qualifier == 'h') {
2398 qualifier = 'H';
2399 fmt++;
2400 } else if (qualifier == 'l') {
2401 qualifier = 'L';
2402 fmt++;
2403 }
2404 }
2405 }
2406
2407 if (!*fmt)
2408 break;
2409
2410 if (*fmt == 'n') {
2411
2412 *va_arg(args, int *) = str - buf;
2413 ++fmt;
2414 continue;
2415 }
2416
2417 if (!*str)
2418 break;
2419
2420 base = 10;
2421 is_sign = false;
2422
2423 switch (*fmt++) {
2424 case 'c':
2425 {
2426 char *s = (char *)va_arg(args, char*);
2427 if (field_width == -1)
2428 field_width = 1;
2429 do {
2430 *s++ = *str++;
2431 } while (--field_width > 0 && *str);
2432 num++;
2433 }
2434 continue;
2435 case 's':
2436 {
2437 char *s = (char *)va_arg(args, char *);
2438 if (field_width == -1)
2439 field_width = SHRT_MAX;
2440
2441 str = skip_spaces(str);
2442
2443
2444 while (*str && !isspace(*str) && field_width--)
2445 *s++ = *str++;
2446 *s = '\0';
2447 num++;
2448 }
2449 continue;
2450 case 'o':
2451 base = 8;
2452 break;
2453 case 'x':
2454 case 'X':
2455 base = 16;
2456 break;
2457 case 'i':
2458 base = 0;
2459 case 'd':
2460 is_sign = true;
2461 case 'u':
2462 break;
2463 case '%':
2464
2465 if (*str++ != '%')
2466 return num;
2467 continue;
2468 default:
2469
2470 return num;
2471 }
2472
2473
2474
2475
2476 str = skip_spaces(str);
2477
2478 digit = *str;
2479 if (is_sign && digit == '-')
2480 digit = *(str + 1);
2481
2482 if (!digit
2483 || (base == 16 && !isxdigit(digit))
2484 || (base == 10 && !isdigit(digit))
2485 || (base == 8 && (!isdigit(digit) || digit > '7'))
2486 || (base == 0 && !isdigit(digit)))
2487 break;
2488
2489 if (is_sign)
2490 val.s = qualifier != 'L' ?
2491 simple_strtol(str, &next, base) :
2492 simple_strtoll(str, &next, base);
2493 else
2494 val.u = qualifier != 'L' ?
2495 simple_strtoul(str, &next, base) :
2496 simple_strtoull(str, &next, base);
2497
2498 if (field_width > 0 && next - str > field_width) {
2499 if (base == 0)
2500 _parse_integer_fixup_radix(str, &base);
2501 while (next - str > field_width) {
2502 if (is_sign)
2503 val.s = div_s64(val.s, base);
2504 else
2505 val.u = div_u64(val.u, base);
2506 --next;
2507 }
2508 }
2509
2510 switch (qualifier) {
2511 case 'H':
2512 if (is_sign)
2513 *va_arg(args, signed char *) = val.s;
2514 else
2515 *va_arg(args, unsigned char *) = val.u;
2516 break;
2517 case 'h':
2518 if (is_sign)
2519 *va_arg(args, short *) = val.s;
2520 else
2521 *va_arg(args, unsigned short *) = val.u;
2522 break;
2523 case 'l':
2524 if (is_sign)
2525 *va_arg(args, long *) = val.s;
2526 else
2527 *va_arg(args, unsigned long *) = val.u;
2528 break;
2529 case 'L':
2530 if (is_sign)
2531 *va_arg(args, long long *) = val.s;
2532 else
2533 *va_arg(args, unsigned long long *) = val.u;
2534 break;
2535 case 'Z':
2536 case 'z':
2537 *va_arg(args, size_t *) = val.u;
2538 break;
2539 default:
2540 if (is_sign)
2541 *va_arg(args, int *) = val.s;
2542 else
2543 *va_arg(args, unsigned int *) = val.u;
2544 break;
2545 }
2546 num++;
2547
2548 if (!next)
2549 break;
2550 str = next;
2551 }
2552
2553 return num;
2554}
2555EXPORT_SYMBOL(vsscanf);
2556
2557
2558
2559
2560
2561
2562
2563int sscanf(const char *buf, const char *fmt, ...)
2564{
2565 va_list args;
2566 int i;
2567
2568 va_start(args, fmt);
2569 i = vsscanf(buf, fmt, args);
2570 va_end(args);
2571
2572 return i;
2573}
2574EXPORT_SYMBOL(sscanf);
2575