nalika / rpms / grub2

Forked from rpms/grub2 2 years ago
Clone

Blame SOURCES/0151-Initialized-initrd_ctx-so-we-don-t-free-a-random-poi.patch

f725e3
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
f725e3
From: Peter Jones <pjones@redhat.com>
f725e3
Date: Wed, 17 Sep 2014 15:13:14 -0500
f725e3
Subject: [PATCH] Initialized initrd_ctx so we don't free a random pointer from
f725e3
 the stack.
f725e3
f725e3
Currently, if "linux" fails, the "goto fail;" in grub_cmd_initrd sends us
f725e3
into grub_initrd_close() without grub_initrd_init() being called, and thus
f725e3
it never clears initrd_ctx->components.  grub_initrd_close() then frees that
f725e3
address, which is stale data from the stack.  If the stack happens to have a
f725e3
stale *address* there that matches a recent allocation, then you'll get a
f725e3
double free later.
f725e3
f725e3
So initialize the memory up front.
f725e3
f725e3
Signed-off-by: Peter Jones <pjones@redhat.com>
f725e3
---
f725e3
 grub-core/loader/arm/linux.c              | 2 +-
f725e3
 grub-core/loader/arm64/linux.c            | 2 +-
f725e3
 grub-core/loader/i386/linux.c             | 2 +-
f725e3
 grub-core/loader/i386/pc/linux.c          | 2 +-
f725e3
 grub-core/loader/ia64/efi/linux.c         | 2 +-
f725e3
 grub-core/loader/mips/linux.c             | 2 +-
f725e3
 grub-core/loader/powerpc/ieee1275/linux.c | 2 +-
f725e3
 grub-core/loader/sparc64/ieee1275/linux.c | 2 +-
f725e3
 8 files changed, 8 insertions(+), 8 deletions(-)
f725e3
f725e3
diff --git a/grub-core/loader/arm/linux.c b/grub-core/loader/arm/linux.c
f725e3
index e6770d96d29..62cbe75d34e 100644
f725e3
--- a/grub-core/loader/arm/linux.c
f725e3
+++ b/grub-core/loader/arm/linux.c
f725e3
@@ -396,7 +396,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
 {
f725e3
   grub_file_t file;
f725e3
   grub_size_t size = 0;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
f725e3
diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c
f725e3
index f1d10a16492..0dc144e5da0 100644
f725e3
--- a/grub-core/loader/arm64/linux.c
f725e3
+++ b/grub-core/loader/arm64/linux.c
f725e3
@@ -328,7 +328,7 @@ static grub_err_t
f725e3
 grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
 		 int argc, char *argv[])
f725e3
 {
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
   int initrd_size, initrd_pages;
f725e3
   void *initrd_mem = NULL;
f725e3
 
f725e3
diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
f725e3
index 31fb91e2c73..2ae176315b6 100644
f725e3
--- a/grub-core/loader/i386/linux.c
f725e3
+++ b/grub-core/loader/i386/linux.c
f725e3
@@ -1050,7 +1050,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
   grub_addr_t addr_min, addr_max;
f725e3
   grub_addr_t addr;
f725e3
   grub_err_t err;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     {
f725e3
diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c
f725e3
index 672c013e74d..b481e466846 100644
f725e3
--- a/grub-core/loader/i386/pc/linux.c
f725e3
+++ b/grub-core/loader/i386/pc/linux.c
f725e3
@@ -388,7 +388,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
   grub_uint8_t *initrd_chunk;
f725e3
   grub_addr_t initrd_addr;
f725e3
   grub_err_t err;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     {
f725e3
diff --git a/grub-core/loader/ia64/efi/linux.c b/grub-core/loader/ia64/efi/linux.c
f725e3
index 87ac49f8c3b..eb78e6e626b 100644
f725e3
--- a/grub-core/loader/ia64/efi/linux.c
f725e3
+++ b/grub-core/loader/ia64/efi/linux.c
f725e3
@@ -568,7 +568,7 @@ static grub_err_t
f725e3
 grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
 		 int argc, char *argv[])
f725e3
 {
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     {
f725e3
diff --git a/grub-core/loader/mips/linux.c b/grub-core/loader/mips/linux.c
f725e3
index ef64a5b1d36..4a3e8c5dfa2 100644
f725e3
--- a/grub-core/loader/mips/linux.c
f725e3
+++ b/grub-core/loader/mips/linux.c
f725e3
@@ -415,7 +415,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
   void *initrd_src;
f725e3
   grub_addr_t initrd_dest;
f725e3
   grub_err_t err;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
f725e3
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
f725e3
index 4a14f66dee5..787d7dc2af3 100644
f725e3
--- a/grub-core/loader/powerpc/ieee1275/linux.c
f725e3
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
f725e3
@@ -333,7 +333,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
   grub_size_t size = 0;
f725e3
   grub_addr_t first_addr;
f725e3
   grub_addr_t addr;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     {
f725e3
diff --git a/grub-core/loader/sparc64/ieee1275/linux.c b/grub-core/loader/sparc64/ieee1275/linux.c
f725e3
index de6ee2f75ed..c5e8dfab234 100644
f725e3
--- a/grub-core/loader/sparc64/ieee1275/linux.c
f725e3
+++ b/grub-core/loader/sparc64/ieee1275/linux.c
f725e3
@@ -373,7 +373,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
f725e3
   grub_addr_t paddr;
f725e3
   grub_addr_t addr;
f725e3
   int ret;
f725e3
-  struct grub_linux_initrd_context initrd_ctx;
f725e3
+  struct grub_linux_initrd_context initrd_ctx = { 0, };
f725e3
 
f725e3
   if (argc == 0)
f725e3
     {