]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[prefix] Delay initrd image copy until memory map is ready
authorMichael Brown <mcb30@ipxe.org>
Thu, 9 Feb 2012 16:41:05 +0000 (16:41 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 9 Feb 2012 16:49:30 +0000 (16:49 +0000)
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>
src/arch/i386/core/runtime.c

index 2ad8c20a40d1037be972f4cb1c7551eee5b1c863..2053bf21252046958c4ca28cfc24a47fcc1b91ac 100644 (file)
@@ -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=" );
@@ -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",
@@ -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,
 };