diff options
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 58 |
1 files changed, 18 insertions, 40 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 185b6d300ebc..0648291cdafe 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -364,7 +364,6 @@ enum format_type { | |||
364 | FORMAT_TYPE_SHORT, | 364 | FORMAT_TYPE_SHORT, |
365 | FORMAT_TYPE_UINT, | 365 | FORMAT_TYPE_UINT, |
366 | FORMAT_TYPE_INT, | 366 | FORMAT_TYPE_INT, |
367 | FORMAT_TYPE_NRCHARS, | ||
368 | FORMAT_TYPE_SIZE_T, | 367 | FORMAT_TYPE_SIZE_T, |
369 | FORMAT_TYPE_PTRDIFF | 368 | FORMAT_TYPE_PTRDIFF |
370 | }; | 369 | }; |
@@ -719,10 +718,15 @@ char *resource_string(char *buf, char *end, struct resource *res, | |||
719 | specp = &mem_spec; | 718 | specp = &mem_spec; |
720 | decode = 0; | 719 | decode = 0; |
721 | } | 720 | } |
722 | p = number(p, pend, res->start, *specp); | 721 | if (decode && res->flags & IORESOURCE_UNSET) { |
723 | if (res->start != res->end) { | 722 | p = string(p, pend, "size ", str_spec); |
724 | *p++ = '-'; | 723 | p = number(p, pend, resource_size(res), *specp); |
725 | p = number(p, pend, res->end, *specp); | 724 | } else { |
725 | p = number(p, pend, res->start, *specp); | ||
726 | if (res->start != res->end) { | ||
727 | *p++ = '-'; | ||
728 | p = number(p, pend, res->end, *specp); | ||
729 | } | ||
726 | } | 730 | } |
727 | if (decode) { | 731 | if (decode) { |
728 | if (res->flags & IORESOURCE_MEM_64) | 732 | if (res->flags & IORESOURCE_MEM_64) |
@@ -1533,10 +1537,6 @@ qualifier: | |||
1533 | return fmt - start; | 1537 | return fmt - start; |
1534 | /* skip alnum */ | 1538 | /* skip alnum */ |
1535 | 1539 | ||
1536 | case 'n': | ||
1537 | spec->type = FORMAT_TYPE_NRCHARS; | ||
1538 | return ++fmt - start; | ||
1539 | |||
1540 | case '%': | 1540 | case '%': |
1541 | spec->type = FORMAT_TYPE_PERCENT_CHAR; | 1541 | spec->type = FORMAT_TYPE_PERCENT_CHAR; |
1542 | return ++fmt - start; | 1542 | return ++fmt - start; |
@@ -1559,6 +1559,15 @@ qualifier: | |||
1559 | case 'u': | 1559 | case 'u': |
1560 | break; | 1560 | break; |
1561 | 1561 | ||
1562 | case 'n': | ||
1563 | /* | ||
1564 | * Since %n poses a greater security risk than utility, treat | ||
1565 | * it as an invalid format specifier. Warn about its use so | ||
1566 | * that new instances don't get added. | ||
1567 | */ | ||
1568 | WARN_ONCE(1, "Please remove ignored %%n in '%s'\n", fmt); | ||
1569 | /* Fall-through */ | ||
1570 | |||
1562 | default: | 1571 | default: |
1563 | spec->type = FORMAT_TYPE_INVALID; | 1572 | spec->type = FORMAT_TYPE_INVALID; |
1564 | return fmt - start; | 1573 | return fmt - start; |
@@ -1732,20 +1741,6 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | |||
1732 | ++str; | 1741 | ++str; |
1733 | break; | 1742 | break; |
1734 | 1743 | ||
1735 | case FORMAT_TYPE_NRCHARS: { | ||
1736 | /* | ||
1737 | * Since %n poses a greater security risk than | ||
1738 | * utility, ignore %n and skip its argument. | ||
1739 | */ | ||
1740 | void *skip_arg; | ||
1741 | |||
1742 | WARN_ONCE(1, "Please remove ignored %%n in '%s'\n", | ||
1743 | old_fmt); | ||
1744 | |||
1745 | skip_arg = va_arg(args, void *); | ||
1746 | break; | ||
1747 | } | ||
1748 | |||
1749 | default: | 1744 | default: |
1750 | switch (spec.type) { | 1745 | switch (spec.type) { |
1751 | case FORMAT_TYPE_LONG_LONG: | 1746 | case FORMAT_TYPE_LONG_LONG: |
@@ -2020,19 +2015,6 @@ do { \ | |||
2020 | fmt++; | 2015 | fmt++; |
2021 | break; | 2016 | break; |
2022 | 2017 | ||
2023 | case FORMAT_TYPE_NRCHARS: { | ||
2024 | /* skip %n 's argument */ | ||
2025 | u8 qualifier = spec.qualifier; | ||
2026 | void *skip_arg; | ||
2027 | if (qualifier == 'l') | ||
2028 | skip_arg = va_arg(args, long *); | ||
2029 | else if (_tolower(qualifier) == 'z') | ||
2030 | skip_arg = va_arg(args, size_t *); | ||
2031 | else | ||
2032 | skip_arg = va_arg(args, int *); | ||
2033 | break; | ||
2034 | } | ||
2035 | |||
2036 | default: | 2018 | default: |
2037 | switch (spec.type) { | 2019 | switch (spec.type) { |
2038 | 2020 | ||
@@ -2191,10 +2173,6 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) | |||
2191 | ++str; | 2173 | ++str; |
2192 | break; | 2174 | break; |
2193 | 2175 | ||
2194 | case FORMAT_TYPE_NRCHARS: | ||
2195 | /* skip */ | ||
2196 | break; | ||
2197 | |||
2198 | default: { | 2176 | default: { |
2199 | unsigned long long num; | 2177 | unsigned long long num; |
2200 | 2178 | ||