2005-02-14 Guillem Jover <guillem@hadrons.org>
* include/grub/dl.h (grub_dl_check_header): New prototype. (grub_arch_dl_check_header): Change return type to grub_err_t, remove size parameter and export function. Update all callers. * kern/dl.c (grub_dl_check_header): New function. (grub_dl_load_core): Use `grub_dl_check_header' instead of `grub_arch_dl_check_header'. Check ELF type. Check if sections are inside the core. * kern/i386/dl.c (grub_arch_dl_check_header): Remove arch independent ELF header checks. * kern/powerpc/dl.c (grub_arch_dl_check_header): Likewise. * loader/i386/pc/multiboot.c (grub_rescue_cmd_multiboot): Use `grub_dl_check_header' instead of explicit checks. Check for the ELF type. * loader/powerpc/ieee1275/linux.c (grub_rescue_cmd_linux): Use `grub_dl_check_header' instead of explicit checks. Remove arch specific ELF header checks.
This commit is contained in:
parent
5eabe94bd9
commit
c642636f8a
8 changed files with 86 additions and 86 deletions
41
kern/dl.c
41
kern/dl.c
|
@ -1,7 +1,7 @@
|
|||
/* dl.c - loadable module support */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -238,6 +238,29 @@ grub_dl_get_section_addr (grub_dl_t mod, unsigned n)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Check if EHDR is a valid ELF header. */
|
||||
grub_err_t
|
||||
grub_dl_check_header (void *ehdr, grub_size_t size)
|
||||
{
|
||||
Elf_Ehdr *e = ehdr;
|
||||
|
||||
/* Check the header size. */
|
||||
if (size < sizeof (Elf_Ehdr))
|
||||
return grub_error (GRUB_ERR_BAD_OS, "ELF header smaller than expected");
|
||||
|
||||
/* Check the magic numbers. */
|
||||
if (grub_arch_dl_check_header (ehdr)
|
||||
|| e->e_ident[EI_MAG0] != ELFMAG0
|
||||
|| e->e_ident[EI_MAG1] != ELFMAG1
|
||||
|| e->e_ident[EI_MAG2] != ELFMAG2
|
||||
|| e->e_ident[EI_MAG3] != ELFMAG3
|
||||
|| e->e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| e->e_version != EV_CURRENT)
|
||||
return grub_error (GRUB_ERR_BAD_OS, "invalid arch independent ELF magic");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Load all segments from memory specified by E. */
|
||||
static grub_err_t
|
||||
grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
|
@ -497,12 +520,22 @@ grub_dl_load_core (void *addr, grub_size_t size)
|
|||
grub_dl_t mod;
|
||||
|
||||
e = addr;
|
||||
if (! grub_arch_dl_check_header (e, size))
|
||||
if (grub_dl_check_header (e, size))
|
||||
return 0;
|
||||
|
||||
if (e->e_type != ET_REL)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_MODULE, "invalid ELF header");
|
||||
grub_error (GRUB_ERR_BAD_MODULE, "invalid ELF file type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Make sure that every section is within the core. */
|
||||
if (size < e->e_shoff + e->e_shentsize * e->e_shnum)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_OS, "ELF sections outside core");
|
||||
return 0;
|
||||
}
|
||||
|
||||
mod = (grub_dl_t) grub_malloc (sizeof (*mod));
|
||||
if (! mod)
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue