Messages in this thread Patch in this message |  | | From | Petr Mladek <> | Subject | [PATCH v4 5/9] vsprintf: Factor out %p[iI] handler as ip_addr_string() | Date | Wed, 4 Apr 2018 10:58:39 +0200 |
| |
Move the non-trivial code from the long pointer() function. We are going to add a check for the access to the address that will make it even more complicated.
Also it is better to warn about unknown specifier instead of falling back to the %p behavior. It will help people to understand what is going wrong. They expect the IP address and not a pointer anyway in this situation.
Signed-off-by: Petr Mladek <pmladek@suse.com> --- lib/vsprintf.c | 54 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 22 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 5a0d01846a11..88b80c7059f0 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1319,6 +1319,37 @@ char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa, } static noinline_for_stack +char *ip_addr_string(char *buf, char *end, const void *ptr, + struct printf_spec spec, const char *fmt) +{ + switch (fmt[1]) { + case '6': + return ip6_addr_string(buf, end, ptr, spec, fmt); + case '4': + return ip4_addr_string(buf, end, ptr, spec, fmt); + case 'S': { + const union { + struct sockaddr raw; + struct sockaddr_in v4; + struct sockaddr_in6 v6; + } *sa = ptr; + + switch (sa->raw.sa_family) { + case AF_INET: + return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt); + case AF_INET6: + return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt); + default: + return __string(buf, end, "(invalid address)", spec); + }} + } + + WARN_ONCE(1, "Unsupported pointer format specifier: %%p%c%c\n", + fmt[0], fmt[1]); + return buf; +} + +static noinline_for_stack char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec, const char *fmt) { @@ -1909,28 +1940,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, * 4: 001.002.003.004 * 6: 000102...0f */ - switch (fmt[1]) { - case '6': - return ip6_addr_string(buf, end, ptr, spec, fmt); - case '4': - return ip4_addr_string(buf, end, ptr, spec, fmt); - case 'S': { - const union { - struct sockaddr raw; - struct sockaddr_in v4; - struct sockaddr_in6 v6; - } *sa = ptr; - - switch (sa->raw.sa_family) { - case AF_INET: - return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt); - case AF_INET6: - return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt); - default: - return __string(buf, end, "(invalid address)", spec); - }} - } - break; + return ip_addr_string(buf, end, ptr, spec, fmt); case 'E': return escaped_string(buf, end, ptr, spec, fmt); case 'U': -- 2.13.6
|  |