disk/lvm: Do not crash if an expected string is not found

Clean up a bunch of cases where we could have strstr() fail and lead to
us dereferencing NULL.

We'll still leak memory in some cases (loops don't clean up allocations
from earlier iterations if a later iteration fails) but at least we're
not crashing.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Daniel Axtens 2021-01-21 18:35:22 +11:00 committed by Daniel Kiper
parent 2958695c4c
commit db29073fc7

View File

@ -578,7 +578,16 @@ grub_lvm_detect (grub_disk_t disk,
} }
if (seg->node_count != 1) if (seg->node_count != 1)
{
seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = "); seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = ");
if (p == NULL)
{
#ifdef GRUB_UTIL
grub_util_info ("unknown stripe_size");
#endif
goto lvs_segment_fail;
}
}
seg->nodes = grub_calloc (seg->node_count, seg->nodes = grub_calloc (seg->node_count,
sizeof (*stripe)); sizeof (*stripe));
@ -598,7 +607,7 @@ grub_lvm_detect (grub_disk_t disk,
{ {
p = grub_strchr (p, '"'); p = grub_strchr (p, '"');
if (p == NULL) if (p == NULL)
continue; goto lvs_segment_fail2;
q = ++p; q = ++p;
while (*q != '"') while (*q != '"')
q++; q++;
@ -617,7 +626,10 @@ grub_lvm_detect (grub_disk_t disk,
stripe->start = grub_lvm_getvalue (&p, ",") stripe->start = grub_lvm_getvalue (&p, ",")
* vg->extent_size; * vg->extent_size;
if (p == NULL) if (p == NULL)
continue; {
grub_free (stripe->name);
goto lvs_segment_fail2;
}
stripe++; stripe++;
} }
@ -654,7 +666,7 @@ grub_lvm_detect (grub_disk_t disk,
p = grub_strchr (p, '"'); p = grub_strchr (p, '"');
if (p == NULL) if (p == NULL)
continue; goto lvs_segment_fail2;
q = ++p; q = ++p;
while (*q != '"') while (*q != '"')
q++; q++;
@ -742,7 +754,7 @@ grub_lvm_detect (grub_disk_t disk,
p = p ? grub_strchr (p + 1, '"') : 0; p = p ? grub_strchr (p + 1, '"') : 0;
p = p ? grub_strchr (p + 1, '"') : 0; p = p ? grub_strchr (p + 1, '"') : 0;
if (p == NULL) if (p == NULL)
continue; goto lvs_segment_fail2;
q = ++p; q = ++p;
while (*q != '"') while (*q != '"')
q++; q++;