loader/xnu: Free driverkey data when an error is detected in grub_xnu_writetree_toheap()

... to avoid memory leaks.

Fixes: CID 96640

Signed-off-by: Marco A Benatto <mbenatto@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Marco A Benatto 2020-11-30 12:18:24 -03:00 committed by Daniel Kiper
parent bcb59ece32
commit 4b4027b6b1

View File

@ -227,26 +227,33 @@ grub_xnu_writetree_toheap (grub_addr_t *target, grub_size_t *size)
if (! memorymap) if (! memorymap)
return grub_errno; return grub_errno;
driverkey = (struct grub_xnu_devtree_key *) grub_malloc (sizeof (*driverkey)); driverkey = (struct grub_xnu_devtree_key *) grub_zalloc (sizeof (*driverkey));
if (! driverkey) if (! driverkey)
return grub_errno; return grub_errno;
driverkey->name = grub_strdup ("DeviceTree"); driverkey->name = grub_strdup ("DeviceTree");
if (! driverkey->name) if (! driverkey->name)
return grub_errno; {
err = grub_errno;
goto fail;
}
driverkey->datasize = sizeof (*extdesc); driverkey->datasize = sizeof (*extdesc);
driverkey->next = memorymap->first_child; driverkey->next = memorymap->first_child;
memorymap->first_child = driverkey; memorymap->first_child = driverkey;
driverkey->data = extdesc driverkey->data = extdesc
= (struct grub_xnu_extdesc *) grub_malloc (sizeof (*extdesc)); = (struct grub_xnu_extdesc *) grub_malloc (sizeof (*extdesc));
if (! driverkey->data) if (! driverkey->data)
return grub_errno; {
err = grub_errno;
goto fail;
}
/* Allocate the space based on the size with dummy value. */ /* Allocate the space based on the size with dummy value. */
*size = grub_xnu_writetree_get_size (grub_xnu_devtree_root, "/"); *size = grub_xnu_writetree_get_size (grub_xnu_devtree_root, "/");
err = grub_xnu_heap_malloc (ALIGN_UP (*size + 1, GRUB_XNU_PAGESIZE), err = grub_xnu_heap_malloc (ALIGN_UP (*size + 1, GRUB_XNU_PAGESIZE),
&src, target); &src, target);
if (err) if (err)
return err; goto fail;
/* Put real data in the dummy. */ /* Put real data in the dummy. */
extdesc->addr = *target; extdesc->addr = *target;
@ -255,6 +262,15 @@ grub_xnu_writetree_toheap (grub_addr_t *target, grub_size_t *size)
/* Write the tree to heap. */ /* Write the tree to heap. */
grub_xnu_writetree_toheap_real (src, grub_xnu_devtree_root, "/"); grub_xnu_writetree_toheap_real (src, grub_xnu_devtree_root, "/");
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
fail:
memorymap->first_child = NULL;
grub_free (driverkey->data);
grub_free (driverkey->name);
grub_free (driverkey);
return err;
} }
/* Find a key or value in parent key. */ /* Find a key or value in parent key. */