]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
disk/lvm: Do not crash if an expected string is not found
authorDaniel Axtens <dja@axtens.net>
Thu, 21 Jan 2021 07:35:22 +0000 (18:35 +1100)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 2 Mar 2021 14:54:18 +0000 (15:54 +0100)
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

index 31bbc9acc97cc89eb6eed96f42098b81c2fa74c8..201097fda8598f99fdb1ffd5dda3dac6eac870c0 100644 (file)
@@ -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++;