0087-loader-xnu-Free-driverkey-data-when-an-error-is-dete.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. From 4b4027b6b1c877d7ab467896b04c7bd1aadcfa15 Mon Sep 17 00:00:00 2001
  2. From: Marco A Benatto <mbenatto@redhat.com>
  3. Date: Mon, 30 Nov 2020 12:18:24 -0300
  4. Subject: [PATCH] loader/xnu: Free driverkey data when an error is detected in
  5. grub_xnu_writetree_toheap()
  6. ... to avoid memory leaks.
  7. Fixes: CID 96640
  8. Signed-off-by: Marco A Benatto <mbenatto@redhat.com>
  9. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
  10. Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
  11. ---
  12. grub-core/loader/xnu.c | 24 ++++++++++++++++++++----
  13. 1 file changed, 20 insertions(+), 4 deletions(-)
  14. diff --git a/grub-core/loader/xnu.c b/grub-core/loader/xnu.c
  15. index eb14462..1a590db 100644
  16. --- a/grub-core/loader/xnu.c
  17. +++ b/grub-core/loader/xnu.c
  18. @@ -227,26 +227,33 @@ grub_xnu_writetree_toheap (grub_addr_t *target, grub_size_t *size)
  19. if (! memorymap)
  20. return grub_errno;
  21. - driverkey = (struct grub_xnu_devtree_key *) grub_malloc (sizeof (*driverkey));
  22. + driverkey = (struct grub_xnu_devtree_key *) grub_zalloc (sizeof (*driverkey));
  23. if (! driverkey)
  24. return grub_errno;
  25. driverkey->name = grub_strdup ("DeviceTree");
  26. if (! driverkey->name)
  27. - return grub_errno;
  28. + {
  29. + err = grub_errno;
  30. + goto fail;
  31. + }
  32. +
  33. driverkey->datasize = sizeof (*extdesc);
  34. driverkey->next = memorymap->first_child;
  35. memorymap->first_child = driverkey;
  36. driverkey->data = extdesc
  37. = (struct grub_xnu_extdesc *) grub_malloc (sizeof (*extdesc));
  38. if (! driverkey->data)
  39. - return grub_errno;
  40. + {
  41. + err = grub_errno;
  42. + goto fail;
  43. + }
  44. /* Allocate the space based on the size with dummy value. */
  45. *size = grub_xnu_writetree_get_size (grub_xnu_devtree_root, "/");
  46. err = grub_xnu_heap_malloc (ALIGN_UP (*size + 1, GRUB_XNU_PAGESIZE),
  47. &src, target);
  48. if (err)
  49. - return err;
  50. + goto fail;
  51. /* Put real data in the dummy. */
  52. extdesc->addr = *target;
  53. @@ -255,6 +262,15 @@ grub_xnu_writetree_toheap (grub_addr_t *target, grub_size_t *size)
  54. /* Write the tree to heap. */
  55. grub_xnu_writetree_toheap_real (src, grub_xnu_devtree_root, "/");
  56. return GRUB_ERR_NONE;
  57. +
  58. + fail:
  59. + memorymap->first_child = NULL;
  60. +
  61. + grub_free (driverkey->data);
  62. + grub_free (driverkey->name);
  63. + grub_free (driverkey);
  64. +
  65. + return err;
  66. }
  67. /* Find a key or value in parent key. */
  68. --
  69. 2.14.2