From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1V09FW-0002O4-Q4 for mharc-grub-devel@gnu.org; Fri, 19 Jul 2013 07:53:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53623) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V09FT-0002Mt-M2 for grub-devel@gnu.org; Fri, 19 Jul 2013 07:53:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V09FQ-0003mm-Ft for grub-devel@gnu.org; Fri, 19 Jul 2013 07:53:23 -0400 Received: from mail-lb0-x22c.google.com ([2a00:1450:4010:c04::22c]:56148) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V09FQ-0003mT-8b for grub-devel@gnu.org; Fri, 19 Jul 2013 07:53:20 -0400 Received: by mail-lb0-f172.google.com with SMTP id v20so3433428lbc.31 for ; Fri, 19 Jul 2013 04:53:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:x-mailer; bh=P9sNVUlte6qlUGnbPTJdWoXOZRYaznEpsQEAZJK1KJY=; b=zK1zDVZ+lllyhtbMhgx0aZO/FU1f1R9I9q608GZvDbdH4U3L7sdGPrQ74UijVgidnM Dw5oDRnXk88VSKuak0JQTYMyz/uP0CTvB8ivmv2BEBnM/gcPrwjo0XHTmv5PeeRpSq1o Xx+rxfocYgLzQSzBRbim7aDcuVpuZSGwGhoiYolAfW9KACyIkOmDq06uVODf2duTWWRI Ol2yjadePWP2ypWi3fiXQhozWHLLQPj24X46y/NH6cNTxMNXuaK+ayRwYNzSyIH0nTBB EIWRtNn0UkzJdI9VkG0fKHaVwwpZKl9KPFrEVS2+WqEjvkjWTIP3OX5ok2Zj6c7sDpSS 7xrA== X-Received: by 10.152.29.227 with SMTP id n3mr7228156lah.43.1374234799129; Fri, 19 Jul 2013 04:53:19 -0700 (PDT) Received: from localhost.localdomain (ppp79-139-160-84.pppoe.spdop.ru. [79.139.160.84]) by mx.google.com with ESMTPSA id p7sm5963425lbi.15.2013.07.19.04.53.18 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 19 Jul 2013 04:53:18 -0700 (PDT) From: Andrey Borzenkov To: grub-devel@gnu.org Subject: [PATCH] fix memory and descriptor leaks in grub_util_is_imsm Date: Fri, 19 Jul 2013 15:53:15 +0400 Message-Id: <1374234795-24104-1-git-send-email-arvidjaar@gmail.com> X-Mailer: git-send-email 1.8.1.4 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4010:c04::22c 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: Fri, 19 Jul 2013 11:53:25 -0000 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__ */ -- tg: (e1a892d..) u/imsm_descriptor_leak (depends on: master)