Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753017AbcLITFT (ORCPT ); Fri, 9 Dec 2016 14:05:19 -0500 Received: from smtprelay0233.hostedemail.com ([216.40.44.233]:39855 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750982AbcLITFS (ORCPT ); Fri, 9 Dec 2016 14:05:18 -0500 X-Session-Marker: 6A6F6540706572636865732E636F6D X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,joe@perches.com,:::::::::,RULES_HIT:41:355:379:541:599:960:966:973:988:989:1042:1260:1277:1311:1313:1314:1345:1359:1373:1437:1515:1516:1518:1534:1542:1593:1594:1711:1730:1747:1777:1792:2194:2196:2198:2199:2200:2201:2393:2553:2559:2562:2828:3138:3139:3140:3141:3142:3354:3622:3865:3866:3868:3870:3871:3872:3874:4321:4385:5007:6691:7576:7903:8660:10004:10400:10848:10967:11026:11232:11473:11658:11914:12043:12266:12295:12438:12555:12679:12740:12760:12986:13148:13161:13229:13230:13439:14093:14096:14097:14659:14721:21080:21212:21451:30012:30054:30070:30079:30090:30091,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:0:0,LFtime:5,LUA_SUMMARY:none X-HE-Tag: brass64_2dee9ccfce753 X-Filterd-Recvd-Size: 3453 Message-ID: <1481310314.5946.40.camel@perches.com> Subject: Re: [PATCH] md: Combine two kmalloc() calls into one in sb_equal() From: Joe Perches To: SF Markus Elfring , linux-raid@vger.kernel.org, Shaohua Li Cc: LKML , kernel-janitors@vger.kernel.org Date: Fri, 09 Dec 2016 11:05:14 -0800 In-Reply-To: References: Content-Type: text/plain; charset="ISO-8859-1" X-Mailer: Evolution 3.22.1-0ubuntu2 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2491 Lines: 93 On Fri, 2016-12-09 at 19:30 +0100, SF Markus Elfring wrote: > From: Markus Elfring > Date: Fri, 9 Dec 2016 19:09:13 +0100 > > The function "kmalloc" was called in one case by the function "sb_equal" > without checking immediately if it failed. > This issue was detected by using the Coccinelle software. > > Perform the desired memory allocation (and release at the end) > by a single function call instead. > > Fixes: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 ("Linux-2.6.12-rc2") Making a change does not mean fixes. There's nothing particularly _wrong_ with the code as-is. 2 kmemdup calls might make the code more obvious. There's a small optimization possible in that only the first MB_SB_GENERIC_CONSTANT_WORDS of the struct are actually compared. Alloc and copy of both entire structs is inefficient and unnecessary. Perhaps something like the below would be marginally better/faster, but the whole thing is dubious. static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2) { int ret; void *tmp1, *tmp2; tmp1 = kmemdup(sb1, MD_SB_GENERIC_CONSTANT_WORDS * sizeof(__u32), GFP_KERNEL); tmp2 = kmemdup(sb2, MD_SB_GENERIC_CONSTANT_WORDS * sizeof(__u32), GFP_KERNEL); if (!tmp1 || !tmp2) { ret = 0; goto out; } /* * nr_disks is not constant */ ((mdp_super_t *)tmp1)->nr_disks = 0; ((mdp_super_t *)tmp2)->nr_disks = 0; ret = memcmp(tmp1, tmp2, MD_SB_GENERIC_CONSTANT_WORDS * sizeof(__u32)) == 0; out: kfree(tmp1); kfree(tmp2); return ret; } > Signed-off-by: Markus Elfring > --- > drivers/md/md.c | 13 ++++--------- > 1 file changed, 4 insertions(+), 9 deletions(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index b088668269b0..86caf2536255 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -843,15 +843,12 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2) > int ret; > mdp_super_t *tmp1, *tmp2; > > - tmp1 = kmalloc(sizeof(*tmp1),GFP_KERNEL); > - tmp2 = kmalloc(sizeof(*tmp2),GFP_KERNEL); > - > - if (!tmp1 || !tmp2) { > - ret = 0; > - goto abort; > - } > + tmp1 = kmalloc(2 * sizeof(*tmp1), GFP_KERNEL); > + if (!tmp1) > + return 0; > > *tmp1 = *sb1; > + tmp2 = tmp1 + 1; > *tmp2 = *sb2; > > /* > @@ -861,9 +858,7 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2) > tmp2->nr_disks = 0; > > ret = (memcmp(tmp1, tmp2, MD_SB_GENERIC_CONSTANT_WORDS * 4) == 0); > -abort: > kfree(tmp1); > - kfree(tmp2); > return ret; > }