Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752975AbcCGP34 (ORCPT ); Mon, 7 Mar 2016 10:29:56 -0500 Received: from e17.ny.us.ibm.com ([129.33.205.207]:38924 "EHLO e17.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752634AbcCGP3s (ORCPT ); Mon, 7 Mar 2016 10:29:48 -0500 X-IBM-Helo: d01dlp02.pok.ibm.com X-IBM-MailFrom: paulmck@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org Date: Mon, 7 Mar 2016 05:37:45 -0800 From: "Paul E. McKenney" To: Kefeng Wang Cc: Davidlohr Bueso , linux-kernel@vger.kernel.org, peterz@infradead.org, mingo@redhat.com, Josh Triplett , "Guohanjun (Hanjun Guo)" Subject: Re: [PATCH v2] locktorture: Fix NULL pointer when torture_type is invalid Message-ID: <20160307133745.GQ3577@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20160202064635.GH6719@linux.vnet.ibm.com> <20160203002331.GA3385@linux-uzut.site> <20160302195543.GA12593@linux-uzut.site> <20160302211216.GC3577@linux.vnet.ibm.com> <56D79566.7010302@huawei.com> <56D7BE33.5010605@huawei.com> <20160303083626.GA10957@linux-uzut.site> <56DCE0D4.1060109@huawei.com> <20160307054007.GA8192@linux-uzut.site> <56DD276D.1070607@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56DD276D.1070607@huawei.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16030715-0041-0000-0000-0000038125B1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3683 Lines: 96 On Mon, Mar 07, 2016 at 03:02:05PM +0800, Kefeng Wang wrote: > > > On 2016/3/7 13:40, Davidlohr Bueso wrote: > > On Mon, 07 Mar 2016, Kefeng Wang wrote: > >> On 2016/3/3 16:36, Davidlohr Bueso wrote: > > > >>> + /* > >>> + * Indicates early cleanup, meaning that the test has not run, > >>> + * such as when passing bogus args when loading the module. As > >>> + * such, only perform the underlying torture-specific cleanups, > >>> + * and avoid anything related to locktorture. > >>> + */ > >>> + if (!cxt.lwsa) > >>> + goto end; > >> > >> Sorry for the late response, the cxt.lrsa should be taken into account too. > > > > I am taking it into account, note that we kfree lwsa if lrsa fails memory > > allocation. Of course we should be defensive, so go ahead and explicitly set > > it to nil. v2 below, otherwise same patch. > > This one looks good, and tested on my board. Very good! May we add your Tested-by? Thanx, Paul > > -----8<-------------------------- > > Subject: [PATCH v2] locktorture: Fix nil pointer dereferencing for cleanup paths > > > > It has been found that paths that invoke cleanups through > > lock_torture_cleanup() can incur in nil pointer dereferencing > > bugs during the statistics printing phase. This is mainly > > because we should not be calling into statistics before we are > > sure things have been setup correctly. > > > > Specifically, early checks (and the need for handling this in > > the cleanup call) only include parameter checks and basic > > statistics allocation. Once we start write/read kthreads > > we then consider the test as started. As such, update the func > > in question to check for cxt.lwsa writer stats, if not set, > > we either have a bogus parameter or ENOMEM situation and > > therefore only need to deal with general torture calls > > > > Reported-by: Kefeng Wang > > Signed-off-by: Davidlohr Bueso > > --- > > kernel/locking/locktorture.c | 12 ++++++++++++ > > 1 file changed, 12 insertions(+) > > > > diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c > > index 8ef1919..b5bc243 100644 > > --- a/kernel/locking/locktorture.c > > +++ b/kernel/locking/locktorture.c > > @@ -748,6 +748,15 @@ static void lock_torture_cleanup(void) > > if (torture_cleanup_begin()) > > return; > > > > + /* > > + * Indicates early cleanup, meaning that the test has not run, > > + * such as when passing bogus args when loading the module. As > > + * such, only perform the underlying torture-specific cleanups, > > + * and avoid anything related to locktorture. > > + */ > > + if (!cxt.lwsa) > > + goto end; > > + > > if (writer_tasks) { > > for (i = 0; i < cxt.nrealwriters_stress; i++) > > torture_stop_kthread(lock_torture_writer, > > @@ -776,6 +785,7 @@ static void lock_torture_cleanup(void) > > else > > lock_torture_print_module_parms(cxt.cur_ops, > > "End of test: SUCCESS"); > > +end: > > torture_cleanup_end(); > > } > > > > @@ -870,6 +880,7 @@ static int __init lock_torture_init(void) > > VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory"); > > firsterr = -ENOMEM; > > kfree(cxt.lwsa); > > + cxt.lwsa = NULL; > > goto unwind; > > } > > > > @@ -878,6 +889,7 @@ static int __init lock_torture_init(void) > > cxt.lrsa[i].n_lock_acquired = 0; > > } > > } > > + > > lock_torture_print_module_parms(cxt.cur_ops, "Start of test"); > > > > /* Prepare torture context. */ >