From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1V9d7C-0003uw-IS for mharc-grub-devel@gnu.org; Wed, 14 Aug 2013 11:36:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V9d72-0003qh-Kq for grub-devel@gnu.org; Wed, 14 Aug 2013 11:36:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V9d6u-0001Tm-64 for grub-devel@gnu.org; Wed, 14 Aug 2013 11:35:52 -0400 Received: from mail-wg0-x232.google.com ([2a00:1450:400c:c00::232]:46980) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V9d6t-0001TW-SW for grub-devel@gnu.org; Wed, 14 Aug 2013 11:35:44 -0400 Received: by mail-wg0-f50.google.com with SMTP id m15so1520944wgh.17 for ; Wed, 14 Aug 2013 08:35:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=fGis6vNMp3bH7/FAQcwp4ostGAH9XMzptdwQXFXmHZo=; b=mQzLqalecUDxceZ95IOtnpc3NV2MhDPwxOLu8+vZSPBgnHDOHbiGBxSJg//NFFV9Ss YhmeFEtyXBvYEUhWkv74P0krUvliRve+w+nE+p5qTd7vqmG8Yq2A0FVHdhqx6BFBW1jd aY7FkygdXWtmb5JU4nIIO4JlnxzyY36lHV/KJE59Z7GkH9oitEoLs7cGSnhqdT47VvQv VvXEKggohT83h5eFMBvvXznYpezDjfHPUZaXCvkb/7uGx1D95q5/xOySTvxkphSK4/K5 uCBWduH/C7xLj6TwZPsliQQEsyFg4oAQxjL3wYuHWhdUTTFXXJSyMFl7LkzSO9HfmSYX MX/Q== X-Received: by 10.194.104.106 with SMTP id gd10mr1459307wjb.45.1376494543014; Wed, 14 Aug 2013 08:35:43 -0700 (PDT) Received: from [192.168.42.216] (223-226.197-178.cust.bluewin.ch. [178.197.226.223]) by mx.google.com with ESMTPSA id bt8sm3734255wib.8.2013.08.14.08.35.41 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 14 Aug 2013 08:35:42 -0700 (PDT) Message-ID: <520BA3C4.6070009@gmail.com> Date: Wed, 14 Aug 2013 17:35:32 +0200 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130630 Icedove/17.0.7 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH] fix memory and descriptor leaks in grub_util_is_imsm References: <1374234795-24104-1-git-send-email-arvidjaar@gmail.com> In-Reply-To: <1374234795-24104-1-git-send-email-arvidjaar@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c00::232 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Aug 2013 15:36:01 -0000 Go ahead. On 19.07.2013 13:53, Andrey Borzenkov wrote: > Descriptor leak caused warning from later vgs invocation. Fix memory > leak (buffer was not always freed) while on it. > > Signed-off-by: Andrey Borzenkov > > --- > util/getroot.c | 29 +++++++++++++++-------------- > 1 file changed, 15 insertions(+), 14 deletions(-) > > diff --git a/util/getroot.c b/util/getroot.c > index 2ad8a55..b30a0d8 100644 > --- a/util/getroot.c > +++ b/util/getroot.c > @@ -1455,10 +1455,12 @@ out: > static int > grub_util_is_imsm (const char *os_dev) > { > - int try; > + int retry; > + int is_imsm = 0; > + int container_seen = 0; > const char *dev = os_dev; > > - for (try = 0; try < 2; try++) > + do > { > char *argv[5]; > int fd; > @@ -1467,6 +1469,8 @@ grub_util_is_imsm (const char *os_dev) > char *buf = NULL; > size_t len = 0; > > + retry = 0; /* We'll do one more pass if device is part of container */ > + > /* execvp has inconvenient types, hence the casts. None of these > strings will actually be modified. */ > argv[0] = (char *) "mdadm"; > @@ -1499,7 +1503,8 @@ grub_util_is_imsm (const char *os_dev) > > while (getline (&buf, &len, mdadm) > 0) > { > - if (strncmp (buf, "MD_CONTAINER=", sizeof ("MD_CONTAINER=") - 1) == 0) > + if (strncmp (buf, "MD_CONTAINER=", sizeof ("MD_CONTAINER=") - 1) == 0 > + && !container_seen) > { > char *newdev, *ptr; > newdev = xstrdup (buf + sizeof ("MD_CONTAINER=") - 1); > @@ -1508,31 +1513,27 @@ grub_util_is_imsm (const char *os_dev) > ptr[1] = 0; > grub_util_info ("Container of %s is %s", dev, newdev); > dev = newdev; > - goto out; > + container_seen = retry = 1; > + break; > } > if (strncmp (buf, "MD_METADATA=imsm", > sizeof ("MD_METADATA=imsm") - 1) == 0) > { > - close (fd); > - waitpid (pid, NULL, 0); > + is_imsm = 1; > grub_util_info ("%s is imsm", dev); > - if (dev != os_dev) > - free ((void *) dev); > - return 1; > + break; > } > } > > free (buf); > - > - return 0; > - > - out: > close (fd); > waitpid (pid, NULL, 0); > } > + while (retry); > + > if (dev != os_dev) > free ((void *) dev); > - return 0; > + return is_imsm; > } > #endif /* __linux__ */ > >