From: Petr Mladek <pmladek@suse.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
"Tobin C . Harding" <me@tobin.cc>, Joe Perches <joe@perches.com>,
Andrew Morton <akpm@linux-foundation.org>,
Michal Hocko <mhocko@suse.cz>,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>,
linux-kernel@vger.kernel.org, Petr Mladek <pmladek@suse.com>
Subject: [PATCH v4 3/9] vsprintf: Do not check address of well-known strings
Date: Wed, 4 Apr 2018 10:58:37 +0200 [thread overview]
Message-ID: <20180404085843.16050-4-pmladek@suse.com> (raw)
In-Reply-To: <20180404085843.16050-1-pmladek@suse.com>
We are going to check the address using probe_kernel_address(). It will
be more expensive and it does not make sense for well known address.
This patch splits the string() function. The variant without the check
is then used on locations that handle string constants or strings defined
as local variables.
This patch does not change the existing behavior.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
lib/vsprintf.c | 79 ++++++++++++++++++++++++++++++++--------------------------
1 file changed, 43 insertions(+), 36 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 9ade2c4f21ba..dd71738d7a09 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -582,14 +582,11 @@ char *widen_string(char *buf, int n, char *end, struct printf_spec spec)
}
static noinline_for_stack
-char *string(char *buf, char *end, const char *s, struct printf_spec spec)
+char *__string(char *buf, char *end, const char *s, struct printf_spec spec)
{
int len = 0;
size_t lim = spec.precision;
- if ((unsigned long)s < PAGE_SIZE)
- s = "(null)";
-
while (lim--) {
char c = *s++;
if (!c)
@@ -602,6 +599,16 @@ char *string(char *buf, char *end, const char *s, struct printf_spec spec)
return widen_string(buf, len, end, spec);
}
+static noinline_for_stack
+char *string(char *buf, char *end, const char *s,
+ struct printf_spec spec)
+{
+ if ((unsigned long)s < PAGE_SIZE)
+ s = "(null)";
+
+ return __string(buf, end, s, spec);
+}
+
static bool have_filled_random_ptr_key __read_mostly;
static siphash_key_t ptr_key __read_mostly;
@@ -646,7 +653,7 @@ static char *ptr_to_id(char *buf, char *end,
if (unlikely(!have_filled_random_ptr_key)) {
spec.field_width = default_width;
/* string length must be less than default_width */
- return string(buf, end, "(ptrval)", spec);
+ return __string(buf, end, "(ptrval)", spec);
}
#ifdef CONFIG_64BIT
@@ -755,7 +762,7 @@ char *symbol_string(char *buf, char *end, void *ptr,
else
sprint_symbol_no_offset(sym, value);
- return string(buf, end, sym, spec);
+ return __string(buf, end, sym, spec);
#else
return special_hex_number(buf, end, value, sizeof(void *));
#endif
@@ -821,27 +828,27 @@ char *resource_string(char *buf, char *end, struct resource *res,
*p++ = '[';
if (res->flags & IORESOURCE_IO) {
- p = string(p, pend, "io ", str_spec);
+ p = __string(p, pend, "io ", str_spec);
specp = &io_spec;
} else if (res->flags & IORESOURCE_MEM) {
- p = string(p, pend, "mem ", str_spec);
+ p = __string(p, pend, "mem ", str_spec);
specp = &mem_spec;
} else if (res->flags & IORESOURCE_IRQ) {
- p = string(p, pend, "irq ", str_spec);
+ p = __string(p, pend, "irq ", str_spec);
specp = &dec_spec;
} else if (res->flags & IORESOURCE_DMA) {
- p = string(p, pend, "dma ", str_spec);
+ p = __string(p, pend, "dma ", str_spec);
specp = &dec_spec;
} else if (res->flags & IORESOURCE_BUS) {
- p = string(p, pend, "bus ", str_spec);
+ p = __string(p, pend, "bus ", str_spec);
specp = &bus_spec;
} else {
- p = string(p, pend, "??? ", str_spec);
+ p = __string(p, pend, "??? ", str_spec);
specp = &mem_spec;
decode = 0;
}
if (decode && res->flags & IORESOURCE_UNSET) {
- p = string(p, pend, "size ", str_spec);
+ p = __string(p, pend, "size ", str_spec);
p = number(p, pend, resource_size(res), *specp);
} else {
p = number(p, pend, res->start, *specp);
@@ -852,21 +859,21 @@ char *resource_string(char *buf, char *end, struct resource *res,
}
if (decode) {
if (res->flags & IORESOURCE_MEM_64)
- p = string(p, pend, " 64bit", str_spec);
+ p = __string(p, pend, " 64bit", str_spec);
if (res->flags & IORESOURCE_PREFETCH)
- p = string(p, pend, " pref", str_spec);
+ p = __string(p, pend, " pref", str_spec);
if (res->flags & IORESOURCE_WINDOW)
- p = string(p, pend, " window", str_spec);
+ p = __string(p, pend, " window", str_spec);
if (res->flags & IORESOURCE_DISABLED)
- p = string(p, pend, " disabled", str_spec);
+ p = __string(p, pend, " disabled", str_spec);
} else {
- p = string(p, pend, " flags ", str_spec);
+ p = __string(p, pend, " flags ", str_spec);
p = number(p, pend, res->flags, flag_spec);
}
*p++ = ']';
*p = '\0';
- return string(buf, end, sym, spec);
+ return __string(buf, end, sym, spec);
}
static noinline_for_stack
@@ -1037,7 +1044,7 @@ char *mac_address_string(char *buf, char *end, u8 *addr,
}
*p = '\0';
- return string(buf, end, mac_addr, spec);
+ return __string(buf, end, mac_addr, spec);
}
static noinline_for_stack
@@ -1200,7 +1207,7 @@ char *ip6_addr_string(char *buf, char *end, const u8 *addr,
else
ip6_string(ip6_addr, addr, fmt);
- return string(buf, end, ip6_addr, spec);
+ return __string(buf, end, ip6_addr, spec);
}
static noinline_for_stack
@@ -1211,7 +1218,7 @@ char *ip4_addr_string(char *buf, char *end, const u8 *addr,
ip4_string(ip4_addr, addr, fmt);
- return string(buf, end, ip4_addr, spec);
+ return __string(buf, end, ip4_addr, spec);
}
static noinline_for_stack
@@ -1273,7 +1280,7 @@ char *ip6_addr_string_sa(char *buf, char *end, const struct sockaddr_in6 *sa,
}
*p = '\0';
- return string(buf, end, ip6_addr, spec);
+ return __string(buf, end, ip6_addr, spec);
}
static noinline_for_stack
@@ -1308,7 +1315,7 @@ char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
}
*p = '\0';
- return string(buf, end, ip4_addr, spec);
+ return __string(buf, end, ip4_addr, spec);
}
static noinline_for_stack
@@ -1409,7 +1416,7 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
*p = 0;
- return string(buf, end, uuid, spec);
+ return __string(buf, end, uuid, spec);
}
int kptr_restrict __read_mostly;
@@ -1437,7 +1444,7 @@ char *restricted_pointer(char *buf, char *end, const void *ptr,
* because its test for CAP_SYSLOG would be meaningless.
*/
if (in_irq() || in_serving_softirq() || in_nmi())
- return string(buf, end, "pK-error", spec);
+ return __string(buf, end, "pK-error", spec);
/*
* Only print the real pointer value if the current
@@ -1613,13 +1620,13 @@ char *device_node_gen_full_name(const struct device_node *np, char *buf, char *e
/* special case for root node */
if (!parent)
- return string(buf, end, "/", strspec);
+ return __string(buf, end, "/", strspec);
for (depth = 0; parent->parent; depth++)
parent = parent->parent;
for ( ; depth >= 0; depth--) {
- buf = string(buf, end, "/", strspec);
+ buf = __string(buf, end, "/", strspec);
buf = string(buf, end, device_node_name_for_depth(np, depth),
strspec);
}
@@ -1647,10 +1654,10 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
str_spec.field_width = -1;
if (!IS_ENABLED(CONFIG_OF))
- return string(buf, end, "(!OF)", spec);
+ return __string(buf, end, "(!OF)", spec);
if ((unsigned long)dn < PAGE_SIZE)
- return string(buf, end, "(null)", spec);
+ return __string(buf, end, "(null)", spec);
/* simple case without anything any more format specifiers */
fmt++;
@@ -1686,7 +1693,7 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
tbuf[2] = of_node_check_flag(dn, OF_POPULATED) ? 'P' : '-';
tbuf[3] = of_node_check_flag(dn, OF_POPULATED_BUS) ? 'B' : '-';
tbuf[4] = 0;
- buf = string(buf, end, tbuf, str_spec);
+ buf = __string(buf, end, tbuf, str_spec);
break;
case 'c': /* major compatible string */
ret = of_property_read_string(dn, "compatible", &p);
@@ -1697,10 +1704,10 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
has_mult = false;
of_property_for_each_string(dn, "compatible", prop, p) {
if (has_mult)
- buf = string(buf, end, ",", str_spec);
- buf = string(buf, end, "\"", str_spec);
+ buf = __string(buf, end, ",", str_spec);
+ buf = __string(buf, end, "\"", str_spec);
buf = string(buf, end, p, str_spec);
- buf = string(buf, end, "\"", str_spec);
+ buf = __string(buf, end, "\"", str_spec);
has_mult = true;
}
@@ -1857,7 +1864,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
*/
if (spec.field_width == -1)
spec.field_width = default_width;
- return string(buf, end, "(null)", spec);
+ return __string(buf, end, "(null)", spec);
}
switch (*fmt) {
@@ -1913,7 +1920,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
case AF_INET6:
return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
default:
- return string(buf, end, "(invalid address)", spec);
+ return __string(buf, end, "(invalid address)", spec);
}}
}
break;
--
2.13.6
next prev parent reply other threads:[~2018-04-04 9:00 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-04 8:58 [PATCH v4 0/9] vsprintf: Prevent silent crashes and consolidate error handling Petr Mladek
2018-04-04 8:58 ` [PATCH v4 1/9] vsprintf: Shuffle ptr_to_id() code Petr Mladek
2018-04-04 8:58 ` [PATCH v4 2/9] vsprintf: Consistent %pK handling for kptr_restrict == 0 Petr Mladek
2018-04-04 23:10 ` Sergey Senozhatsky
2018-04-05 14:34 ` Petr Mladek
2018-04-05 13:04 ` Andy Shevchenko
2018-04-05 14:46 ` Petr Mladek
2018-04-07 14:08 ` Andy Shevchenko
2018-04-09 12:05 ` Petr Mladek
2018-04-09 12:11 ` Andy Shevchenko
2018-04-04 8:58 ` Petr Mladek [this message]
2018-04-05 13:30 ` [PATCH v4 3/9] vsprintf: Do not check address of well-known strings Rasmus Villemoes
2018-04-06 9:15 ` Petr Mladek
2018-04-07 14:12 ` Andy Shevchenko
2018-04-09 12:19 ` Petr Mladek
2018-04-10 10:05 ` Andy Shevchenko
2018-04-04 8:58 ` [PATCH v4 4/9] vsprintf: Consolidate handling of unknown pointer specifiers Petr Mladek
2018-04-05 14:25 ` Rasmus Villemoes
2018-04-05 23:45 ` Joe Perches
2018-04-05 23:55 ` Joe Perches
2018-04-06 11:43 ` Petr Mladek
2018-04-06 13:17 ` Rasmus Villemoes
2018-04-06 14:27 ` Joe Perches
2018-04-09 12:30 ` Petr Mladek
2018-04-07 14:23 ` Andy Shevchenko
2018-04-06 23:52 ` Sergey Senozhatsky
2018-04-06 23:59 ` Joe Perches
2018-04-07 0:33 ` Sergey Senozhatsky
2018-04-07 1:00 ` Joe Perches
2018-04-07 1:17 ` Sergey Senozhatsky
2018-04-06 11:25 ` Petr Mladek
2018-04-07 14:26 ` Andy Shevchenko
2018-04-09 13:50 ` Petr Mladek
2018-04-10 11:41 ` Andy Shevchenko
2018-04-11 9:52 ` Petr Mladek
2018-04-24 16:47 ` Andy Shevchenko
2018-04-04 8:58 ` [PATCH v4 5/9] vsprintf: Factor out %p[iI] handler as ip_addr_string() Petr Mladek
2018-04-04 23:58 ` Sergey Senozhatsky
2018-04-05 14:14 ` Petr Mladek
2018-04-07 14:30 ` Andy Shevchenko
2018-04-04 8:58 ` [PATCH v4 6/9] vsprintf: Factor out %pV handler as va_format() Petr Mladek
2018-04-04 14:26 ` Joe Perches
2018-04-06 13:12 ` Petr Mladek
2018-04-06 14:19 ` Joe Perches
2018-04-09 11:44 ` Petr Mladek
2018-04-09 11:59 ` Joe Perches
2018-04-04 8:58 ` [PATCH v4 7/9] vsprintf: Factor out %pO handler as kobject_string() Petr Mladek
2018-04-04 23:35 ` Sergey Senozhatsky
2018-04-04 23:43 ` Sergey Senozhatsky
2018-04-05 14:02 ` Petr Mladek
2018-04-04 8:58 ` [PATCH v4 8/9] vsprintf: Prevent crash when dereferencing invalid pointers Petr Mladek
2018-04-05 14:46 ` Rasmus Villemoes
2018-04-06 12:26 ` Petr Mladek
2018-04-06 13:12 ` Rasmus Villemoes
2018-04-10 13:26 ` Petr Mladek
2018-04-06 9:37 ` Rasmus Villemoes
2018-04-04 8:58 ` [PATCH v4 9/9] vsprintf: Avoid confusion between invalid address and value Petr Mladek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180404085843.16050-4-pmladek@suse.com \
--to=pmladek@suse.com \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=me@tobin.cc \
--cc=mhocko@suse.cz \
--cc=rostedt@goodmis.org \
--cc=sergey.senozhatsky.work@gmail.com \
--cc=sergey.senozhatsky@gmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®