0121-disk-lvm-Do-not-crash-if-an-expected-string-is-not-f.patch 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. From db29073fc7aec71a40dabfc722a96ea9f3280907 Mon Sep 17 00:00:00 2001
  2. From: Daniel Axtens <dja@axtens.net>
  3. Date: Thu, 21 Jan 2021 18:35:22 +1100
  4. Subject: [PATCH] disk/lvm: Do not crash if an expected string is not found
  5. Clean up a bunch of cases where we could have strstr() fail and lead to
  6. us dereferencing NULL.
  7. We'll still leak memory in some cases (loops don't clean up allocations
  8. from earlier iterations if a later iteration fails) but at least we're
  9. not crashing.
  10. Signed-off-by: Daniel Axtens <dja@axtens.net>
  11. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
  12. Signed-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
  13. ---
  14. grub-core/disk/lvm.c | 22 +++++++++++++++++-----
  15. 1 file changed, 17 insertions(+), 5 deletions(-)
  16. diff --git a/grub-core/disk/lvm.c b/grub-core/disk/lvm.c
  17. index 8e560f3..bd5ae87 100644
  18. --- a/grub-core/disk/lvm.c
  19. +++ b/grub-core/disk/lvm.c
  20. @@ -539,7 +539,16 @@ grub_lvm_detect (grub_disk_t disk,
  21. }
  22. if (seg->node_count != 1)
  23. - seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = ");
  24. + {
  25. + seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = ");
  26. + if (p == NULL)
  27. + {
  28. +#ifdef GRUB_UTIL
  29. + grub_util_info ("unknown stripe_size");
  30. +#endif
  31. + goto lvs_segment_fail;
  32. + }
  33. + }
  34. seg->nodes = grub_calloc (seg->node_count,
  35. sizeof (*stripe));
  36. @@ -559,7 +568,7 @@ grub_lvm_detect (grub_disk_t disk,
  37. {
  38. p = grub_strchr (p, '"');
  39. if (p == NULL)
  40. - continue;
  41. + goto lvs_segment_fail2;
  42. q = ++p;
  43. while (*q != '"')
  44. q++;
  45. @@ -578,7 +587,10 @@ grub_lvm_detect (grub_disk_t disk,
  46. stripe->start = grub_lvm_getvalue (&p, ",")
  47. * vg->extent_size;
  48. if (p == NULL)
  49. - continue;
  50. + {
  51. + grub_free (stripe->name);
  52. + goto lvs_segment_fail2;
  53. + }
  54. stripe++;
  55. }
  56. @@ -615,7 +627,7 @@ grub_lvm_detect (grub_disk_t disk,
  57. p = grub_strchr (p, '"');
  58. if (p == NULL)
  59. - continue;
  60. + goto lvs_segment_fail2;
  61. q = ++p;
  62. while (*q != '"')
  63. q++;
  64. @@ -703,7 +715,7 @@ grub_lvm_detect (grub_disk_t disk,
  65. p = p ? grub_strchr (p + 1, '"') : 0;
  66. p = p ? grub_strchr (p + 1, '"') : 0;
  67. if (p == NULL)
  68. - continue;
  69. + goto lvs_segment_fail2;
  70. q = ++p;
  71. while (*q != '"')
  72. q++;
  73. --
  74. 2.14.2