grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SECURITY PATCH 089/117] disk/lvm: Do not crash if an expected string is


From: Daniel Kiper
Subject: [SECURITY PATCH 089/117] disk/lvm: Do not crash if an expected string is not found
Date: Tue, 2 Mar 2021 19:01:36 +0100

From: Daniel Axtens <dja@axtens.net>

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>
---
 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 31bbc9acc..201097fda 100644
--- a/grub-core/disk/lvm.c
+++ b/grub-core/disk/lvm.c
@@ -578,7 +578,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));
@@ -598,7 +607,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++;
@@ -617,7 +626,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++;
                        }
@@ -654,7 +666,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++;
@@ -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;
                          if (p == NULL)
-                           continue;
+                           goto lvs_segment_fail2;
                          q = ++p;
                          while (*q != '"')
                            q++;
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]