return sector;
}
+static void
+free_pv (struct grub_diskfilter_pv *pv)
+{
+ if (pv == NULL)
+ return;
+
+ grub_free (pv->internal_id);
+ grub_free (pv->id.uuid);
+ grub_free (pv);
+}
+
+static void
+free_lv (struct grub_diskfilter_lv *lv)
+{
+ if (lv == NULL)
+ return;
+
+ grub_free (lv->internal_id);
+ grub_free (lv->name);
+ grub_free (lv->fullname);
+ if (lv->segments)
+ {
+ unsigned int i;
+ for (i = 0; i < lv->segment_count; i++)
+ grub_free (lv->segments[i].nodes);
+ grub_free (lv->segments);
+ }
+ grub_free (lv);
+}
+
static struct grub_diskfilter_vg *
make_vg (grub_disk_t disk,
const struct grub_ldm_label *label)
vg->name = grub_malloc (LDM_NAME_STRLEN + 1);
vg->uuid = grub_malloc (LDM_GUID_STRLEN + 1);
if (! vg->uuid || !vg->name)
- {
- grub_free (vg->uuid);
- grub_free (vg->name);
- grub_free (vg);
- return NULL;
- }
+ goto fail1;
+
grub_memcpy (vg->uuid, label->group_guid, LDM_GUID_STRLEN);
grub_memcpy (vg->name, label->group_name, LDM_NAME_STRLEN);
vg->name[LDM_NAME_STRLEN] = 0;
pv->internal_id = grub_malloc (sz);
if (!pv->internal_id)
{
- grub_free (pv);
+ free_pv (pv);
goto fail2;
}
grub_memcpy (pv->internal_id, ptr, (grub_size_t) ptr[0] + 1);
if (ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (pv);
+ free_pv (pv);
goto fail2;
}
/* ptr = name. */
if (ptr + *ptr + 1
>= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (pv);
+ free_pv (pv);
goto fail2;
}
pv->id.uuidlen = *ptr;
if (grub_add (pv->id.uuidlen, 1, &sz))
{
- grub_free (pv->internal_id);
- grub_free (pv);
+ free_pv (pv);
goto fail2;
}
pv->id.uuid = grub_malloc (sz);
if (pv->id.uuid == NULL)
{
- grub_free (pv->internal_id);
- grub_free (pv);
+ free_pv (pv);
goto fail2;
}
grub_memcpy (pv->id.uuid, ptr + 1, pv->id.uuidlen);
lv->segments = grub_zalloc (sizeof (*lv->segments));
if (!lv->segments)
{
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
lv->segments->start_extent = 0;
sizeof (*lv->segments->nodes));
if (!lv->segments->nodes)
{
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
ptr = vblk[i].dynamic;
if (ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
if (grub_add (ptr[0], 2, &sz))
{
- grub_free (lv->segments);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
lv->internal_id = grub_malloc (sz);
if (!lv->internal_id)
{
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
grub_memcpy (lv->internal_id, ptr, ptr[0] + 1);
if (ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
if (grub_add (*ptr, 1, &sz))
{
- grub_free (lv->internal_id);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
lv->name = grub_malloc (sz);
if (!lv->name)
{
- grub_free (lv->internal_id);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
grub_memcpy (lv->name, ptr + 1, *ptr);
vg->uuid, lv->name);
if (!lv->fullname)
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
ptr += *ptr + 1;
if (ptr + *ptr + 1
>= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
/* ptr = volume type. */
ptr += *ptr + 1;
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
/* ptr = flags. */
ptr += *ptr + 1;
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
/* ptr = number of children. */
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
ptr += *ptr + 1;
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
|| ptr + *ptr + 1>= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv);
+ free_lv (lv);
goto fail2;
}
lv->size = read_int (ptr + 1, *ptr);
ptr = vblk[i].dynamic;
if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
if (grub_add (ptr[0], 2, &sz))
{
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
comp->internal_id = grub_malloc (sz);
if (!comp->internal_id)
{
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
grub_memcpy (comp->internal_id, ptr, ptr[0] + 1);
ptr += *ptr + 1;
if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
/* ptr = name. */
ptr += *ptr + 1;
if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
/* ptr = state. */
ptr += 4;
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
ptr += *ptr + 1;
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
ptr += 8 + 8;
if (ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
for (lv = vg->lvs; lv; lv = lv->next)
}
if (!lv)
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
continue;
}
comp->size = lv->size;
sizeof (*comp->segments));
if (!comp->segments)
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
}
comp->segments = grub_malloc (sizeof (*comp->segments));
if (!comp->segments)
{
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
comp->segments->start_extent = 0;
}
else
{
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
ptr += *ptr + 1;
ptr++;
if (!(vblk[i].flags & 0x10))
{
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
|| ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
comp->segments->stripe_size = read_int (ptr + 1, *ptr);
if (ptr + *ptr + 1 >= vblk[i].dynamic
+ sizeof (vblk[i].dynamic))
{
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
comp->segments->node_count = read_int (ptr + 1, *ptr);
comp->segments->node_alloc = comp->segments->node_count;
comp->segments->nodes = grub_calloc (comp->segments->node_alloc,
sizeof (*comp->segments->nodes));
- if (!lv->segments->nodes)
+ if (comp->segments->nodes == NULL)
{
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
}
if (grub_mul (lv->segments->node_alloc, 2, &lv->segments->node_alloc) ||
grub_mul (lv->segments->node_alloc, sizeof (*lv->segments->nodes), &sz))
{
- grub_free (comp->segments->nodes);
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
t = grub_realloc (lv->segments->nodes, sz);
if (!t)
{
- grub_free (comp->segments->nodes);
- grub_free (comp->segments);
- grub_free (comp->internal_id);
- grub_free (comp);
+ free_lv (comp);
goto fail2;
}
lv->segments->nodes = t;
comp->segments[comp->segment_count].nodes
= grub_malloc (sizeof (*comp->segments[comp->segment_count].nodes));
if (!comp->segments[comp->segment_count].nodes)
- goto fail2;
+ {
+ grub_free (comp->segments);
+ goto fail2;
+ }
comp->segments[comp->segment_count].nodes[0] = part;
comp->segment_count++;
}
struct grub_diskfilter_pv *pv, *next_pv;
for (lv = vg->lvs; lv; lv = next_lv)
{
- unsigned i;
- for (i = 0; i < lv->segment_count; i++)
- grub_free (lv->segments[i].nodes);
-
next_lv = lv->next;
- grub_free (lv->segments);
- grub_free (lv->internal_id);
- grub_free (lv->name);
- grub_free (lv->fullname);
- grub_free (lv);
+ free_lv (lv);
+
}
for (pv = vg->pvs; pv; pv = next_pv)
{
next_pv = pv->next;
- grub_free (pv->id.uuid);
- grub_free (pv);
+ free_pv (pv);
}
}
+ fail1:
grub_free (vg->uuid);
+ grub_free (vg->name);
grub_free (vg);
return NULL;
}