Skip to content

Commit

Permalink
[prefix] Delay initrd image copy until memory map is ready
Browse files Browse the repository at this point in the history
initrd_init() calls umalloc() to allocate space for the initrd image,
but does so before hide_etherboot() has been called.  It is therefore
possible for the initrd to end up overwriting iPXE itself.

Fix by converting initrd_init() from an init_fn to a startup_fn.

Originally-fixed-by: Till Straumann <strauman@slac.stanford.edu>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Feb 9, 2012
1 parent b5ed30b commit 3a42538
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/arch/i386/core/runtime.c
Expand Up @@ -135,6 +135,9 @@ static int cmdline_init ( void ) {
DBGC ( colour, "RUNTIME found command line \"%s\" at %08x\n",
cmdline, cmdline_phys );

/* Mark command line as consumed */
cmdline_phys = 0;

/* Strip unwanted cruft from the command line */
cmdline_strip ( cmdline, "BOOT_IMAGE=" );
cmdline_strip ( cmdline, "initrd=" );
Expand Down Expand Up @@ -205,6 +208,9 @@ static int initrd_init ( void ) {
memcpy_user ( image->data, 0, phys_to_user ( initrd_phys ), 0,
initrd_len );

/* Mark initrd as consumed */
initrd_phys = 0;

/* Register image */
if ( ( rc = register_image ( image ) ) != 0 ) {
DBGC ( colour, "RUNTIME could not register initrd: %s\n",
Expand Down Expand Up @@ -245,6 +251,6 @@ static void runtime_init ( void ) {
}

/** Command line and initrd initialisation function */
struct init_fn runtime_init_fn __init_fn ( INIT_NORMAL ) = {
.initialise = runtime_init,
struct startup_fn runtime_startup_fn __startup_fn ( STARTUP_NORMAL ) = {
.startup = runtime_init,
};

0 comments on commit 3a42538

Please sign in to comment.