OSDN Git Service

gpt: do not leak a GPT header on an error path
authorJim Meyering <meyering@redhat.com>
Fri, 15 Jan 2010 18:34:00 +0000 (19:34 +0100)
committerJim Meyering <meyering@redhat.com>
Fri, 15 Jan 2010 18:43:41 +0000 (19:43 +0100)
* libparted/labels/gpt.c (gpt_write): Avoid a leak by freeing the
header buffer after pth_get_raw call where it's used, but before
checking whether that pth_get_raw call succeeded.
Avoid another leak in identical just 10 lines down.
Add "FIXME: caution..." comments to warn about the duplication.

libparted/labels/gpt.c

index fe1f300..76537fd 100644 (file)
@@ -1208,11 +1208,13 @@ gpt_write (const PedDisk *disk)
     goto error_free_ptes;
 
   /* Write PTH and PTEs */
+  /* FIXME: Caution: this code is nearly identical to what's just below. */
   if (_generate_header (disk, 0, ptes_crc, &gpt) != 0)
     goto error_free_ptes;
-  if ((pth_raw = pth_get_raw (disk->dev, gpt)) == NULL)
-    goto error_free_ptes;
+  pth_raw = pth_get_raw (disk->dev, gpt);
   pth_free (gpt);
+  if (pth_raw == NULL)
+    goto error_free_ptes;
   int write_ok = ped_device_write (disk->dev, pth_raw, 1, 1);
   free (pth_raw);
   if (!write_ok)
@@ -1222,11 +1224,13 @@ gpt_write (const PedDisk *disk)
     goto error_free_ptes;
 
   /* Write Alternate PTH & PTEs */
+  /* FIXME: Caution: this code is nearly identical to what's just above. */
   if (_generate_header (disk, 1, ptes_crc, &gpt) != 0)
     goto error_free_ptes;
-  if ((pth_raw = pth_get_raw (disk->dev, gpt)) == NULL)
-    goto error_free_ptes;
+  pth_raw = pth_get_raw (disk->dev, gpt);
   pth_free (gpt);
+  if (pth_raw == NULL)
+    goto error_free_ptes;
   write_ok = ped_device_write (disk->dev, pth_raw, disk->dev->length - 1, 1);
   free (pth_raw);
   if (!write_ok)