84 lines
2.3 KiB
Diff
84 lines
2.3 KiB
Diff
|
From db29073fc7aec71a40dabfc722a96ea9f3280907 Mon Sep 17 00:00:00 2001
|
||
|
From: Daniel Axtens <dja@axtens.net>
|
||
|
Date: Thu, 21 Jan 2021 18:35:22 +1100
|
||
|
Subject: [PATCH] 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>
|
||
|
Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
|
||
|
---
|
||
|
grub-core/disk/lvm.c | 22 +++++++++++++++++-----
|
||
|
1 file changed, 17 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/grub-core/disk/lvm.c b/grub-core/disk/lvm.c
|
||
|
index 8e560f3..bd5ae87 100644
|
||
|
--- a/grub-core/disk/lvm.c
|
||
|
+++ b/grub-core/disk/lvm.c
|
||
|
@@ -539,7 +539,16 @@ grub_lvm_detect (grub_disk_t disk,
|
||
|
}
|
||
|
|
||
|
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,
|
||
|
sizeof (*stripe));
|
||
|
@@ -559,7 +568,7 @@ grub_lvm_detect (grub_disk_t disk,
|
||
|
{
|
||
|
p = grub_strchr (p, '"');
|
||
|
if (p == NULL)
|
||
|
- continue;
|
||
|
+ goto lvs_segment_fail2;
|
||
|
q = ++p;
|
||
|
while (*q != '"')
|
||
|
q++;
|
||
|
@@ -578,7 +587,10 @@ grub_lvm_detect (grub_disk_t disk,
|
||
|
stripe->start = grub_lvm_getvalue (&p, ",")
|
||
|
* vg->extent_size;
|
||
|
if (p == NULL)
|
||
|
- continue;
|
||
|
+ {
|
||
|
+ grub_free (stripe->name);
|
||
|
+ goto lvs_segment_fail2;
|
||
|
+ }
|
||
|
|
||
|
stripe++;
|
||
|
}
|
||
|
@@ -615,7 +627,7 @@ grub_lvm_detect (grub_disk_t disk,
|
||
|
|
||
|
p = grub_strchr (p, '"');
|
||
|
if (p == NULL)
|
||
|
- continue;
|
||
|
+ goto lvs_segment_fail2;
|
||
|
q = ++p;
|
||
|
while (*q != '"')
|
||
|
q++;
|
||
|
@@ -703,7 +715,7 @@ grub_lvm_detect (grub_disk_t disk,
|
||
|
p = p ? grub_strchr (p + 1, '"') : 0;
|
||
|
p = p ? grub_strchr (p + 1, '"') : 0;
|
||
|
if (p == NULL)
|
||
|
- continue;
|
||
|
+ goto lvs_segment_fail2;
|
||
|
q = ++p;
|
||
|
while (*q != '"')
|
||
|
q++;
|
||
|
--
|
||
|
2.14.2
|
||
|
|