On (02/08/19 16:23), Petr Mladek wrote:
[..]
>  Plain Pointers
>  --------------
> diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> index 3a95b4d1ca2e..e51cbc2be540 100644
> --- a/lib/vsprintf.c
> +++ b/lib/vsprintf.c
> @@ -1510,7 +1510,7 @@ char *ip_addr_string(char *buf, char *end, const void 
> *ptr,
>               case AF_INET6:
>                       return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
>               default:
> -                     return string_nocheck(buf, end, "(invalid address)", 
> spec);
> +                     return string_nocheck(buf, end, "(einval)", spec);
>               }}

Hmm... The original code looks "a bit" dangerous.

Suppose, in my driver I want to sprintf() IPv4 address. The longest
possible address is 3 * 4 (%d%d%d) + 3 bytes (dots) + terminating NULL.
E.g. 111.111.111.111

So I can allocate a 16-bytes buffer (stack or slab) and accidentally
do an %piS sprintf() on a corrupted in_addr struct:

                char buf[16];
                sprintf(buf, "%piS", in_addr);

forcing sprintf() to write "(invalid address)" to a 16-bytes buffer,
but the thing is - strlen("(invalid address)") > 16.


We might want to take this change out of this series.

        -ss

Reply via email to