mirror of
https://git.proxmox.com/git/grub2
synced 2025-08-15 15:24:03 +00:00
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:
parent
bcb59ece32
commit
4b4027b6b1
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user