Received: by 10.223.185.116 with SMTP id b49csp5995962wrg; Wed, 28 Feb 2018 02:06:19 -0800 (PST) X-Google-Smtp-Source: AH8x226PSD8AibBb2S3I4K+UcwOiDKuSX7f4G+UvedLOsWfQ4a7j0LlKz831mAaWDup5U62DEA5g X-Received: by 2002:a17:902:4c88:: with SMTP id b8-v6mr17338405ple.0.1519812379360; Wed, 28 Feb 2018 02:06:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519812379; cv=none; d=google.com; s=arc-20160816; b=gSdY4/rJfqzxBpccnI9sMnJy2D1qdZ8pO9bpz+Y2W5ABZIKmeYM4d/VqHMXg2IUEQm rIpEBGjOwf1VPAfcnQBwwSIzSDOpErZctMJC5gAjFB4hOXxl0e87jKV7H8E6tuwD+LD3 3V3cZEfwg7UR6GaBSfjNeUsJVXaqlZEPI/+o+nxbFNZrPi/+dIZmMW85rtMRUg1l/LsK zRLwS0qJYB5a/8jfB+1+aMko/UoZnl+vrE/XVXloKNhUPWXO3eXxN4qgdpyr2z+8h4g7 mWqVMcTNakKHzAHCZ2oyo2rDcLb34c/kLhTZRWVjL1ssnFRFeVdyXa1DmuXAXUwM4L27 GRUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=kLGPjZh5rdP/G6undErtDTGHrK2fgq/nyHZ+Ppdz4x8=; b=G2TjsFS7fasviqd8gQi7TfjJjpPaYw4RAJ9R+7RcMkGLE6dGEJMA+tGGQ2uYuJVmNY T7Zct/4fxkv4jHPV+9/k4AnVmM+dmdQ4Ajeu2zudHxezkXWBYZbNCiQOjH2ZKOgM1FhO JO/vrLXniDrU/2AZ+wLE49NKAS/lgW0CNjK92703+lZWWxD8XnSzFKYQeL7u68Irpawh KYWsTbVzy5MtuyK9rzxGvs8MqxEWFJZWhRwPDq/gXXJL+lQbpM4ycacslkguTsXbDjMp CGH4Ib9dakmHYhLxFMmnuY9xlOZFgXQWRrJQQSX8ebFgqbZ4JzTYiOt7ZFqqng2wCpwb PLrg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i22-v6si1052697pll.175.2018.02.28.02.06.02; Wed, 28 Feb 2018 02:06:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752503AbeB1KEo (ORCPT + 99 others); Wed, 28 Feb 2018 05:04:44 -0500 Received: from mx2.suse.de ([195.135.220.15]:48883 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752332AbeB1KEm (ORCPT ); Wed, 28 Feb 2018 05:04:42 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B7B5DAD4D; Wed, 28 Feb 2018 10:04:40 +0000 (UTC) Date: Wed, 28 Feb 2018 11:04:37 +0100 From: Petr Mladek To: Andy Shevchenko Cc: "Tobin C . Harding" , linux@rasmusvillemoes.dk, Joe Perches , linux-kernel@vger.kernel.org, Andrew Morton , Michal Hocko Subject: Re: [PATCH v2 8/9] lib/vsprintf: Remove useless NULL checks Message-ID: <20180228100437.o4juwxbzomkqjvjx@pathway.suse.cz> References: <20180216210711.79901-1-andriy.shevchenko@linux.intel.com> <20180216210711.79901-8-andriy.shevchenko@linux.intel.com> <20180227155047.o74ohmoyj56up6pa@pathway.suse.cz> <1519752950.10722.231.camel@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1519752950.10722.231.camel@linux.intel.com> User-Agent: NeoMutt/20170421 (1.8.2) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > > > Signed-off-by: Andy Shevchenko > > > --- > > > 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 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