All of lore.kernel.org
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: "Tobin C . Harding" <me@tobin.cc>,
	linux@rasmusvillemoes.dk, Joe Perches <joe@perches.com>,
	linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Michal Hocko <mhocko@suse.cz>
Subject: Re: [PATCH v2 8/9] lib/vsprintf: Remove useless NULL checks
Date: Wed, 28 Feb 2018 11:04:37 +0100	[thread overview]
Message-ID: <20180228100437.o4juwxbzomkqjvjx@pathway.suse.cz> (raw)
In-Reply-To: <1519752950.10722.231.camel@linux.intel.com>

On Tue 2018-02-27 19:35:50, Andy Shevchenko wrote:
> On Tue, 2018-02-27 at 16:50 +0100, Petr Mladek wrote:
> > On Fri 2018-02-16 23:07:10, Andy Shevchenko wrote:
> > > The pointer can't be NULL since it's first what has been done in the
> > > pointer().
> > > 
> > > Remove useless checks.
> > > 
> > > Note we leave check for !CONFIG_HAVE_CLK to make compiler
> > > to optimize code away when possible.
> > > 
> > > Cc: Petr Mladek <pmladek@suse.com>
> > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > > ---
> > >  lib/vsprintf.c | 13 +------------
> > >  1 file changed, 1 insertion(+), 12 deletions(-)
> > > 
> > > diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> > > index 97be2d07297a..a49da00b79e7 100644
> > > --- a/lib/vsprintf.c
> > > +++ b/lib/vsprintf.c
> > > @@ -819,10 +819,6 @@ char *hex_string(char *buf, char *end, u8
> > > *addr, struct printf_spec spec,
> > >  		/* nothing to print */
> > >  		return buf;
> > >  
> > > -	if (ZERO_OR_NULL_PTR(addr))
> > 
> > This macro matches also values <= 16.
> 
> Yes, I know.
> 
> This had been discussed with Rasmus and we agreed that printing a result
> of kmalloc(0) is rather weird.

I see
https://lkml.kernel.org/r/1500546142.29303.133.camel@linux.intel.com
There you suggested to move this check into pointer(). But I do not
see any agreement on this.


> Moreover, in couple of cases I added these checks.
>  
> > >  	switch (fmt[1]) {
> > > @@ -1580,9 +1572,6 @@ char *device_node_string(char *buf, char *end,
> > > struct device_node *dn,
> > >  	if (!IS_ENABLED(CONFIG_OF))
> > >  		return string(buf, end, "(!OF)", spec);
> > >  
> > > -	if ((unsigned long)dn < PAGE_SIZE)
> > > -		return string(buf, end, "(null)", spec);
> > 
> > In this case, "null" was printed for ptr < PAGE_SIZE. The same check
> > is also in string() function.
> 
> Do we have a uses cases when invalid (non-NULL) pointer is supplied to
> print function?
> 
> Those call sites have to be fixed.

I am not aware of any. But this patch will make fixing such locations
more complicated. The kernel would crash and might not show any message.
Is this really what we want?

Note that it will most likely crash in vprintk_emit() on the line

   text_len = vscnprintf(text, sizeof(textbuf), fmt, args);

It will be with logbug_lock() taken. The nested printk() messages
will be stored in per-CPU buffer thanks to printk_safe code.
They might eventually be printed by printk_safe_flush_on_panic()
but it is not guaranteed.


> > Note that it is not only about the printed value. The pointer is later
> > derefecend. We will start crashing on dn > 0 && dn < PAGE_SIZE.
> 
> Yes.
> So, fix the call sites!

It would be easier if printk() was able to show the message
when hitting this place.

I did some archaeology. The first check for PAGE_SIZE was added
by the pre-git commit:

commit 8bcb3ba1dec5749a7f1eed570cb69a20c2e4bd41
Author: Andrew Morton <akpm@osdl.org>
Date:   Tue Oct 21 18:22:28 2003 -0700

    [PATCH] make printk more robust with "null" pointers
    
    Expand printk's traditional handling of null pointers so that anything in the
    first page is considered a null pointer.
    
    This gives us better behaviour when someone (acpi..) accidentally prints a
    string which is embedded in a struct, the pointer to which is null.


IMHO, it would make sense to hanve this check also pointers that are
being deferred.


> > To be honest, I do not feel experienced enough to decide
> > about the preferred behavior. On one hand, it is bad when
> > printk() would crash the kernel. On the other hand, hiding wide
> > range of values under "(null)" string might confuse people.
> 
> > Would it make sense to survive and write different strings for
> > difference intervals? For example?
> > 
> >     "(null)"     for ptr == 0
> >     "(null-16)"  for ptr > 0 && ptr <= 16
> >     "(null-pg)"  for prt > 16 && ptr <= PAGE_SIZE
> > 
> > In each case, this patch changes the behavior and it should
> > be documented in the commit message.
> 
> Personally I strongly disagree with blowing code up in such places for
> little or none benefit.

I do not have strong opinion here. I could imagine that this might
save a day to some people. But I have never encountered such a bug
myself.

To make it clear. Your clean up work makes sense. I just want to point
out that this patch is not as innocent as the commit message suggest.
Also I think that it goes in the wrong direction regarding the
ability to show useful information in a buggy situation.

Best Regards,
Petr

  reply	other threads:[~2018-02-28 10:04 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-16 21:07 [PATCH v2 1/9] lib/test_printf: Mark big constant with ULL Andy Shevchenko
2018-02-16 21:07 ` [PATCH v2 2/9] lib/vsprintf: Make dec_spec global Andy Shevchenko
2018-04-11  9:44   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 3/9] lib/vsprintf: Make strspec global Andy Shevchenko
2018-04-11  9:44   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 4/9] lib/vsprintf: Make flag_spec global Andy Shevchenko
2018-04-11  9:45   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 5/9] lib/vsprintf: Move pointer_string() upper Andy Shevchenko
2018-04-11  9:45   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 6/9] lib/vsprintf: Deduplicate pointer_string() Andy Shevchenko
2018-04-11  9:46   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 7/9] lib/vsprintf: Replace space with '_' before crng is ready Andy Shevchenko
2018-02-20  2:57   ` [此邮件可能存在风险] " Yang, Shunyong
2018-04-11  9:47   ` Petr Mladek
2018-02-16 21:07 ` [PATCH v2 8/9] lib/vsprintf: Remove useless NULL checks Andy Shevchenko
2018-02-27 15:50   ` Petr Mladek
2018-02-27 17:35     ` Andy Shevchenko
2018-02-28 10:04       ` Petr Mladek [this message]
2018-02-28 10:42         ` Andy Shevchenko
2018-03-02 12:51           ` Petr Mladek
2018-03-02 12:53             ` [PATCH] vsprintf: Make "null" pointer dereference more robust Petr Mladek
2018-03-02 14:17               ` Andy Shevchenko
2018-03-05 14:53                 ` Petr Mladek
2018-03-29 15:13                 ` Petr Mladek
2018-03-29 16:11                   ` Joe Perches
2018-03-05 15:16               ` Rasmus Villemoes
2018-03-05 15:25                 ` Andy Shevchenko
2018-03-06  9:25                 ` Petr Mladek
2018-03-06  9:56                   ` Andy Shevchenko
2018-03-07 15:52                     ` Petr Mladek
2018-03-07 18:18                       ` Andy Shevchenko
2018-03-07 18:34                       ` Linus Torvalds
2018-03-08 14:18                         ` Petr Mladek
2018-03-08 16:45                           ` Linus Torvalds
2018-03-08 17:26                             ` Linus Torvalds
2018-03-09 15:01                               ` Petr Mladek
2018-03-09 19:05                                 ` Linus Torvalds
2018-03-14 14:09                                   ` [PATCH v3] vsprintf: Prevent crash when dereferencing invalid pointers Petr Mladek
2018-03-14 22:12                                     ` Rasmus Villemoes
2018-03-15 15:07                                       ` Petr Mladek
2018-03-15 17:07                                         ` Steven Rostedt
2018-03-15 17:06                                       ` Steven Rostedt
2018-03-15  0:57                                     ` Sergey Senozhatsky
2018-03-15  7:58                                     ` Sergey Senozhatsky
2018-03-15  8:03                                       ` Sergey Senozhatsky
2018-03-15 17:01                                         ` Steven Rostedt
2018-03-16  1:18                                           ` Sergey Senozhatsky
2018-03-16  1:35                                             ` Linus Torvalds
2018-03-16  5:53                                               ` Sergey Senozhatsky
2018-03-16  8:55                                                 ` Petr Mladek
2018-03-16 14:32                                                   ` Steven Rostedt
2018-03-17  1:29                                                   ` Sergey Senozhatsky
2018-03-15 13:07                                       ` Andy Shevchenko
2018-03-15 13:09                                     ` Andy Shevchenko
2018-03-15 15:26                                       ` Petr Mladek
2018-03-16 18:19                                         ` Andy Shevchenko
2018-03-29 14:53                                           ` Petr Mladek
2018-04-02 14:15                                             ` Andy Shevchenko
2018-04-03  1:12                                               ` Sergey Senozhatsky
2018-04-03 11:52                                                 ` Petr Mladek
2018-04-03 11:56                                                   ` Andy Shevchenko
2018-04-03 13:57                                                   ` Sergey Senozhatsky
2018-04-03 11:46                                               ` Petr Mladek
2018-04-03 11:54                                                 ` Andy Shevchenko
2018-04-03 13:13                                                   ` Petr Mladek
2018-04-03 13:40                                                     ` Andy Shevchenko
2018-04-03 14:50                                                       ` Petr Mladek
2018-03-15 14:48                                     ` kbuild test robot
2018-03-15 20:26                                     ` kbuild test robot
2018-03-06 18:11                   ` [PATCH 1/2] vsprintf: distinguish between (null), (err) and (invalid) pointer derefs Adam Borowski
2018-03-06 18:11                     ` [PATCH 2/2] vsprintf: don't dereference pointers to the first or last page Adam Borowski
2018-03-07 13:22                       ` Andy Shevchenko
2018-03-07 13:17                     ` [PATCH 1/2] vsprintf: distinguish between (null), (err) and (invalid) pointer derefs Andy Shevchenko
2018-03-07 13:42                       ` Adam Borowski
2018-03-07 13:29                     ` Andy Shevchenko
2018-03-02 14:15             ` [PATCH v2 8/9] lib/vsprintf: Remove useless NULL checks Andy Shevchenko
2018-03-05 14:57               ` Petr Mladek
2018-02-28 10:44         ` Andy Shevchenko
2018-03-01 14:56         ` Andy Shevchenko
2018-02-16 21:07 ` [PATCH v2 9/9] lib/vsprintf: Mark expected switch fall-through Andy Shevchenko
2018-04-11  9:47   ` Petr Mladek
2018-02-18 12:58 ` [PATCH v2 1/9] lib/test_printf: Mark big constant with ULL Luc Van Oostenryck
2018-02-18 14:20   ` Andy Shevchenko
2018-02-19 15:24   ` Andy Shevchenko
2018-04-11  9:41     ` Petr Mladek
2018-02-18 21:52 ` Tobin C. Harding
2018-02-18 23:55   ` Andy Shevchenko

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=20180228100437.o4juwxbzomkqjvjx@pathway.suse.cz \
    --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 \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.