Initialized initrd_ctx so we don't free a random pointer from the stack.
Currently, if "linux" fails, the "goto fail;" in grub_cmd_initrd sends us into grub_initrd_close() without grub_initrd_init() being called, and thus it never clears initrd_ctx->components. grub_initrd_close() then frees that address, which is stale data from the stack. If the stack happens to have a stale *address* there that matches a recent allocation, then you'll get a double free later. So initialize the memory up front. Signed-off-by: Peter Jones <pjones@redhat.com>
This commit is contained in:
parent
60049a0e72
commit
631a820038
9 changed files with 20 additions and 8 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2014-21-15 Peter Jones <pjones@redhat.com>
|
||||||
|
|
||||||
|
* grub-core/loader/arm/linux.c: Initialized initrd_ctx so
|
||||||
|
we don't free a random pointer from the stack.
|
||||||
|
* grub-core/loader/arm64/linux.c: Likewise.
|
||||||
|
* grub-core/loader/i386/linux.c: Likewise.
|
||||||
|
* grub-core/loader/i386/pc/linux.c: Likewise.
|
||||||
|
* grub-core/loader/ia64/efi/linux.c: Likewise.
|
||||||
|
* grub-core/loader/mips/linux.c: Likewise.
|
||||||
|
* grub-core/loader/powerpc/ieee1275/linux.c: Likewise.
|
||||||
|
* grub-core/loader/sparc64/ieee1275/linux.c: Likewise.
|
||||||
|
|
||||||
2014-09-15 Khem Raj <raj.khem@gmail.com>
|
2014-09-15 Khem Raj <raj.khem@gmail.com>
|
||||||
|
|
||||||
* grub-core/kern/emu/hostfs.c: use _DEFAULT_SOURCE in addition to
|
* grub-core/kern/emu/hostfs.c: use _DEFAULT_SOURCE in addition to
|
||||||
|
|
|
@ -396,7 +396,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_size_t size = 0;
|
grub_size_t size = 0;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
|
@ -328,7 +328,7 @@ static grub_err_t
|
||||||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
int argc, char *argv[])
|
int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
int initrd_size, initrd_pages;
|
int initrd_size, initrd_pages;
|
||||||
void *initrd_mem = NULL;
|
void *initrd_mem = NULL;
|
||||||
|
|
||||||
|
|
|
@ -1050,7 +1050,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_addr_t addr_min, addr_max;
|
grub_addr_t addr_min, addr_max;
|
||||||
grub_addr_t addr;
|
grub_addr_t addr;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -388,7 +388,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_uint8_t *initrd_chunk;
|
grub_uint8_t *initrd_chunk;
|
||||||
grub_addr_t initrd_addr;
|
grub_addr_t initrd_addr;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -568,7 +568,7 @@ static grub_err_t
|
||||||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
int argc, char *argv[])
|
int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -415,7 +415,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
void *initrd_src;
|
void *initrd_src;
|
||||||
grub_addr_t initrd_dest;
|
grub_addr_t initrd_dest;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
|
@ -333,7 +333,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_size_t size = 0;
|
grub_size_t size = 0;
|
||||||
grub_addr_t first_addr;
|
grub_addr_t first_addr;
|
||||||
grub_addr_t addr;
|
grub_addr_t addr;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -373,7 +373,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_addr_t paddr;
|
grub_addr_t paddr;
|
||||||
grub_addr_t addr;
|
grub_addr_t addr;
|
||||||
int ret;
|
int ret;
|
||||||
struct grub_linux_initrd_context initrd_ctx;
|
struct grub_linux_initrd_context initrd_ctx = { 0, };
|
||||||
|
|
||||||
if (argc == 0)
|
if (argc == 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue