]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
Redefine bzimage_exec_context::mem_limit to be the highest permissible
authorMichael Brown <mcb30@etherboot.org>
Fri, 28 Sep 2007 00:23:06 +0000 (01:23 +0100)
committerMichael Brown <mcb30@etherboot.org>
Fri, 28 Sep 2007 00:23:06 +0000 (01:23 +0100)
byte, rather than the number of permissible bytes (i.e. subtract one
from the value under the previous definition to get the value under
the new definition).

This avoids integer overflow on 64-bit kernels, where
bzhdr.initrd_addr_max may be 0xffffffffffffffff; under the old
behaviour we set mem_limit equal to initrd_addr_max+1, which meant it
ended up as zero.  Kernel loads would fail with ENOBUFS.

src/arch/i386/image/bzimage.c

index ad2a04cf8ed3b706a4a6cbb1ee74ea7d008df541..439153e2163980fbf29687b5fadedc588c1a9714 100644 (file)
@@ -141,6 +141,7 @@ static int bzimage_parse_cmdline ( struct image *image,
                               "terminator '%c'\n", image, *mem );
                        break;
                }
+               exec_ctx->mem_limit -= 1;
        }
 
        return 0;
@@ -266,7 +267,7 @@ static int bzimage_load_initrds ( struct image *image,
                        return -ENOBUFS;
                }
                /* Check that we are within the kernel's range */
-               if ( ( address + total_len ) > exec_ctx->mem_limit )
+               if ( ( address + total_len - 1 ) > exec_ctx->mem_limit )
                        continue;
                /* Prepare and verify segment */
                if ( ( rc = prep_segment ( phys_to_user ( address ), 0,
@@ -315,9 +316,9 @@ static int bzimage_exec ( struct image *image ) {
                ( bzhdr.heap_end_ptr + 0x200 );
        exec_ctx.vid_mode = bzhdr.vid_mode;
        if ( bzhdr.version >= 0x0203 ) {
-               exec_ctx.mem_limit = ( bzhdr.initrd_addr_max + 1 );
+               exec_ctx.mem_limit = bzhdr.initrd_addr_max;
        } else {
-               exec_ctx.mem_limit = ( BZI_INITRD_MAX + 1 );
+               exec_ctx.mem_limit = BZI_INITRD_MAX;
        }
 
        /* Parse command line for bootloader parameters */