2
1

0068-loader-i386-bsd-Use-safe-math-to-avoid-underflow.patch 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. From 02a0365799f5ca3d70c4e28b5d11ade56c4c1652 Mon Sep 17 00:00:00 2001
  2. From: Alec Brown <alec.r.brown@oracle.com>
  3. Date: Wed, 5 Feb 2025 22:04:08 +0000
  4. Subject: [PATCH] loader/i386/bsd: Use safe math to avoid underflow
  5. The operation kern_end - kern_start may underflow when we input it into
  6. grub_relocator_alloc_chunk_addr() call. To avoid this we can use safe
  7. math for this subtraction.
  8. Fixes: CID 73845
  9. Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
  10. Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
  11. Upstream: 4dc6166571645780c459dde2cdc1b001a5ec844c
  12. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  13. ---
  14. grub-core/loader/i386/bsd.c | 14 ++++++++++----
  15. 1 file changed, 10 insertions(+), 4 deletions(-)
  16. diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c
  17. index 1f9128f6f..578433402 100644
  18. --- a/grub-core/loader/i386/bsd.c
  19. +++ b/grub-core/loader/i386/bsd.c
  20. @@ -1340,6 +1340,7 @@ static grub_err_t
  21. grub_bsd_load_elf (grub_elf_t elf, const char *filename)
  22. {
  23. grub_err_t err;
  24. + grub_size_t sz;
  25. kern_end = 0;
  26. kern_start = ~0;
  27. @@ -1370,8 +1371,11 @@ grub_bsd_load_elf (grub_elf_t elf, const char *filename)
  28. if (grub_errno)
  29. return grub_errno;
  30. - err = grub_relocator_alloc_chunk_addr (relocator, &ch,
  31. - kern_start, kern_end - kern_start);
  32. +
  33. + if (grub_sub (kern_end, kern_start, &sz))
  34. + return grub_error (GRUB_ERR_OUT_OF_RANGE, "underflow detected while determining size of kernel for relocator");
  35. +
  36. + err = grub_relocator_alloc_chunk_addr (relocator, &ch, kern_start, sz);
  37. if (err)
  38. return err;
  39. @@ -1431,8 +1435,10 @@ grub_bsd_load_elf (grub_elf_t elf, const char *filename)
  40. {
  41. grub_relocator_chunk_t ch;
  42. - err = grub_relocator_alloc_chunk_addr (relocator, &ch, kern_start,
  43. - kern_end - kern_start);
  44. + if (grub_sub (kern_end, kern_start, &sz))
  45. + return grub_error (GRUB_ERR_OUT_OF_RANGE, "underflow detected while determining size of kernel for relocator");
  46. +
  47. + err = grub_relocator_alloc_chunk_addr (relocator, &ch, kern_start, sz);
  48. if (err)
  49. return err;
  50. kern_chunk_src = get_virtual_current_address (ch);
  51. --
  52. 2.50.1