1*4882a593SmuzhiyunFrom 23e39f50ca7a107f6b66396ed4d177a914dee035 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Marco A Benatto <mbenatto@redhat.com> 3*4882a593SmuzhiyunDate: Mon, 7 Dec 2020 11:53:03 -0300 4*4882a593SmuzhiyunSubject: [PATCH] disk/ldm: Make sure comp data is freed before exiting from 5*4882a593Smuzhiyun make_vg() 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunSeveral error handling paths in make_vg() do not free comp data before 8*4882a593Smuzhiyunjumping to fail2 label and returning from the function. This will leak 9*4882a593Smuzhiyunmemory. So, let's fix all issues of that kind. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunFixes: CID 73804 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunSigned-off-by: Marco A Benatto <mbenatto@redhat.com> 14*4882a593SmuzhiyunReviewed-by: Daniel Kiper <daniel.kiper@oracle.com> 15*4882a593SmuzhiyunSigned-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com> 16*4882a593Smuzhiyun--- 17*4882a593Smuzhiyun grub-core/disk/ldm.c | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 18*4882a593Smuzhiyun 1 file changed, 44 insertions(+), 7 deletions(-) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyundiff --git a/grub-core/disk/ldm.c b/grub-core/disk/ldm.c 21*4882a593Smuzhiyunindex 58f8a53..428415f 100644 22*4882a593Smuzhiyun--- a/grub-core/disk/ldm.c 23*4882a593Smuzhiyun+++ b/grub-core/disk/ldm.c 24*4882a593Smuzhiyun@@ -554,7 +554,11 @@ make_vg (grub_disk_t disk, 25*4882a593Smuzhiyun comp->segments = grub_calloc (comp->segment_alloc, 26*4882a593Smuzhiyun sizeof (*comp->segments)); 27*4882a593Smuzhiyun if (!comp->segments) 28*4882a593Smuzhiyun- goto fail2; 29*4882a593Smuzhiyun+ { 30*4882a593Smuzhiyun+ grub_free (comp->internal_id); 31*4882a593Smuzhiyun+ grub_free (comp); 32*4882a593Smuzhiyun+ goto fail2; 33*4882a593Smuzhiyun+ } 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun else 36*4882a593Smuzhiyun { 37*4882a593Smuzhiyun@@ -562,7 +566,11 @@ make_vg (grub_disk_t disk, 38*4882a593Smuzhiyun comp->segment_count = 1; 39*4882a593Smuzhiyun comp->segments = grub_malloc (sizeof (*comp->segments)); 40*4882a593Smuzhiyun if (!comp->segments) 41*4882a593Smuzhiyun- goto fail2; 42*4882a593Smuzhiyun+ { 43*4882a593Smuzhiyun+ grub_free (comp->internal_id); 44*4882a593Smuzhiyun+ grub_free (comp); 45*4882a593Smuzhiyun+ goto fail2; 46*4882a593Smuzhiyun+ } 47*4882a593Smuzhiyun comp->segments->start_extent = 0; 48*4882a593Smuzhiyun comp->segments->extent_count = lv->size; 49*4882a593Smuzhiyun comp->segments->layout = 0; 50*4882a593Smuzhiyun@@ -574,15 +582,26 @@ make_vg (grub_disk_t disk, 51*4882a593Smuzhiyun comp->segments->layout = GRUB_RAID_LAYOUT_SYMMETRIC_MASK; 52*4882a593Smuzhiyun } 53*4882a593Smuzhiyun else 54*4882a593Smuzhiyun- goto fail2; 55*4882a593Smuzhiyun+ { 56*4882a593Smuzhiyun+ grub_free (comp->segments); 57*4882a593Smuzhiyun+ grub_free (comp->internal_id); 58*4882a593Smuzhiyun+ grub_free (comp); 59*4882a593Smuzhiyun+ goto fail2; 60*4882a593Smuzhiyun+ } 61*4882a593Smuzhiyun ptr += *ptr + 1; 62*4882a593Smuzhiyun ptr++; 63*4882a593Smuzhiyun if (!(vblk[i].flags & 0x10)) 64*4882a593Smuzhiyun- goto fail2; 65*4882a593Smuzhiyun+ { 66*4882a593Smuzhiyun+ grub_free (comp->segments); 67*4882a593Smuzhiyun+ grub_free (comp->internal_id); 68*4882a593Smuzhiyun+ grub_free (comp); 69*4882a593Smuzhiyun+ goto fail2; 70*4882a593Smuzhiyun+ } 71*4882a593Smuzhiyun if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic) 72*4882a593Smuzhiyun || ptr + *ptr + 1 >= vblk[i].dynamic 73*4882a593Smuzhiyun + sizeof (vblk[i].dynamic)) 74*4882a593Smuzhiyun { 75*4882a593Smuzhiyun+ grub_free (comp->segments); 76*4882a593Smuzhiyun grub_free (comp->internal_id); 77*4882a593Smuzhiyun grub_free (comp); 78*4882a593Smuzhiyun goto fail2; 79*4882a593Smuzhiyun@@ -592,6 +611,7 @@ make_vg (grub_disk_t disk, 80*4882a593Smuzhiyun if (ptr + *ptr + 1 >= vblk[i].dynamic 81*4882a593Smuzhiyun + sizeof (vblk[i].dynamic)) 82*4882a593Smuzhiyun { 83*4882a593Smuzhiyun+ grub_free (comp->segments); 84*4882a593Smuzhiyun grub_free (comp->internal_id); 85*4882a593Smuzhiyun grub_free (comp); 86*4882a593Smuzhiyun goto fail2; 87*4882a593Smuzhiyun@@ -601,7 +621,12 @@ make_vg (grub_disk_t disk, 88*4882a593Smuzhiyun comp->segments->nodes = grub_calloc (comp->segments->node_alloc, 89*4882a593Smuzhiyun sizeof (*comp->segments->nodes)); 90*4882a593Smuzhiyun if (!lv->segments->nodes) 91*4882a593Smuzhiyun- goto fail2; 92*4882a593Smuzhiyun+ { 93*4882a593Smuzhiyun+ grub_free (comp->segments); 94*4882a593Smuzhiyun+ grub_free (comp->internal_id); 95*4882a593Smuzhiyun+ grub_free (comp); 96*4882a593Smuzhiyun+ goto fail2; 97*4882a593Smuzhiyun+ } 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun if (lv->segments->node_alloc == lv->segments->node_count) 101*4882a593Smuzhiyun@@ -611,11 +636,23 @@ make_vg (grub_disk_t disk, 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun if (grub_mul (lv->segments->node_alloc, 2, &lv->segments->node_alloc) || 104*4882a593Smuzhiyun grub_mul (lv->segments->node_alloc, sizeof (*lv->segments->nodes), &sz)) 105*4882a593Smuzhiyun- goto fail2; 106*4882a593Smuzhiyun+ { 107*4882a593Smuzhiyun+ grub_free (comp->segments->nodes); 108*4882a593Smuzhiyun+ grub_free (comp->segments); 109*4882a593Smuzhiyun+ grub_free (comp->internal_id); 110*4882a593Smuzhiyun+ grub_free (comp); 111*4882a593Smuzhiyun+ goto fail2; 112*4882a593Smuzhiyun+ } 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun t = grub_realloc (lv->segments->nodes, sz); 115*4882a593Smuzhiyun if (!t) 116*4882a593Smuzhiyun- goto fail2; 117*4882a593Smuzhiyun+ { 118*4882a593Smuzhiyun+ grub_free (comp->segments->nodes); 119*4882a593Smuzhiyun+ grub_free (comp->segments); 120*4882a593Smuzhiyun+ grub_free (comp->internal_id); 121*4882a593Smuzhiyun+ grub_free (comp); 122*4882a593Smuzhiyun+ goto fail2; 123*4882a593Smuzhiyun+ } 124*4882a593Smuzhiyun lv->segments->nodes = t; 125*4882a593Smuzhiyun } 126*4882a593Smuzhiyun lv->segments->nodes[lv->segments->node_count].pv = 0; 127*4882a593Smuzhiyun-- 128*4882a593Smuzhiyun2.14.2 129*4882a593Smuzhiyun 130