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
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2005-02-13 Hollis Blanchard <hollis@penguinppc.org>
|
2005-02-13 Hollis Blanchard <hollis@penguinppc.org>
|
||||||
|
|
||||||
* conf/powerpc-ieee1275.rmk (pkgdata_MODULES): Add ls.mod.
|
* conf/powerpc-ieee1275.rmk (pkgdata_MODULES): Add ls.mod.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* dl.h - types and prototypes for loadable module support */
|
/* dl.h - types and prototypes for loadable module support */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
* Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software; you can redistribute it and/or modify
|
* GRUB is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -70,6 +70,7 @@ struct grub_dl
|
||||||
};
|
};
|
||||||
typedef struct grub_dl *grub_dl_t;
|
typedef struct grub_dl *grub_dl_t;
|
||||||
|
|
||||||
|
grub_err_t EXPORT_FUNC(grub_dl_check_header) (void *ehdr, grub_size_t size);
|
||||||
grub_dl_t EXPORT_FUNC(grub_dl_load_file) (const char *filename);
|
grub_dl_t EXPORT_FUNC(grub_dl_load_file) (const char *filename);
|
||||||
grub_dl_t EXPORT_FUNC(grub_dl_load) (const char *name);
|
grub_dl_t EXPORT_FUNC(grub_dl_load) (const char *name);
|
||||||
grub_dl_t grub_dl_load_core (void *addr, grub_size_t size);
|
grub_dl_t grub_dl_load_core (void *addr, grub_size_t size);
|
||||||
|
@ -84,7 +85,7 @@ grub_err_t EXPORT_FUNC(grub_dl_register_symbol) (const char *name, void *addr,
|
||||||
grub_dl_t mod);
|
grub_dl_t mod);
|
||||||
void *EXPORT_FUNC(grub_dl_resolve_symbol) (const char *name);
|
void *EXPORT_FUNC(grub_dl_resolve_symbol) (const char *name);
|
||||||
|
|
||||||
int grub_arch_dl_check_header (void *ehdr, grub_size_t size);
|
grub_err_t grub_arch_dl_check_header (void *ehdr);
|
||||||
grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr);
|
grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr);
|
||||||
|
|
||||||
#endif /* ! GRUB_DL_H */
|
#endif /* ! GRUB_DL_H */
|
||||||
|
|
39
kern/dl.c
39
kern/dl.c
|
@ -1,7 +1,7 @@
|
||||||
/* dl.c - loadable module support */
|
/* dl.c - loadable module support */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* 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
|
* GRUB is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* 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;
|
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. */
|
/* Load all segments from memory specified by E. */
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||||
|
@ -497,9 +520,19 @@ grub_dl_load_core (void *addr, grub_size_t size)
|
||||||
grub_dl_t mod;
|
grub_dl_t mod;
|
||||||
|
|
||||||
e = addr;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* dl-386.c - arch-dependent part of loadable module support */
|
/* dl-386.c - arch-dependent part of loadable module support */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2002 Free Software Foundation, Inc.
|
* Copyright (C) 2002, 2005 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software; you can redistribute it and/or modify
|
* GRUB is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,32 +24,18 @@
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
|
|
||||||
/* Check if EHDR is a valid ELF header. */
|
/* Check if EHDR is a valid ELF header. */
|
||||||
int
|
grub_err_t
|
||||||
grub_arch_dl_check_header (void *ehdr, grub_size_t size)
|
grub_arch_dl_check_header (void *ehdr)
|
||||||
{
|
{
|
||||||
Elf32_Ehdr *e = ehdr;
|
Elf32_Ehdr *e = ehdr;
|
||||||
|
|
||||||
/* Check the header size. */
|
|
||||||
if (size < sizeof (Elf32_Ehdr))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Check the magic numbers. */
|
/* Check the magic numbers. */
|
||||||
if (e->e_ident[EI_MAG0] != ELFMAG0
|
if (e->e_ident[EI_CLASS] != ELFCLASS32
|
||||||
|| e->e_ident[EI_MAG1] != ELFMAG1
|
|
||||||
|| e->e_ident[EI_MAG2] != ELFMAG2
|
|
||||||
|| e->e_ident[EI_MAG3] != ELFMAG3
|
|
||||||
|| e->e_version != EV_CURRENT
|
|
||||||
|| e->e_ident[EI_CLASS] != ELFCLASS32
|
|
||||||
|| e->e_ident[EI_DATA] != ELFDATA2LSB
|
|| e->e_ident[EI_DATA] != ELFDATA2LSB
|
||||||
|| e->e_machine != EM_386
|
|| e->e_machine != EM_386)
|
||||||
|| e->e_type != ET_REL)
|
return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Make sure that every section is within the core. */
|
return GRUB_ERR_NONE;
|
||||||
if (size < e->e_shoff + e->e_shentsize * e->e_shnum)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Relocate symbols. */
|
/* Relocate symbols. */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* dl.c - arch-dependent part of loadable module support */
|
/* dl.c - arch-dependent part of loadable module support */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
* Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software; you can redistribute it and/or modify
|
* GRUB is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,32 +24,18 @@
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
|
|
||||||
/* Check if EHDR is a valid ELF header. */
|
/* Check if EHDR is a valid ELF header. */
|
||||||
int
|
grub_err_t
|
||||||
grub_arch_dl_check_header (void *ehdr, grub_size_t size)
|
grub_arch_dl_check_header (void *ehdr)
|
||||||
{
|
{
|
||||||
Elf32_Ehdr *e = ehdr;
|
Elf32_Ehdr *e = ehdr;
|
||||||
|
|
||||||
/* Check the header size. */
|
|
||||||
if (size < sizeof (Elf32_Ehdr))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Check the magic numbers. */
|
/* Check the magic numbers. */
|
||||||
if (!((e->e_ident[EI_MAG0] == ELFMAG0)
|
if (e->e_ident[EI_CLASS] != ELFCLASS32
|
||||||
&& (e->e_ident[EI_MAG1] == ELFMAG1)
|
|| e->e_ident[EI_DATA] != ELFDATA2MSB
|
||||||
&& (e->e_ident[EI_MAG2] == ELFMAG2)
|
|| e->e_machine != EM_PPC)
|
||||||
&& (e->e_ident[EI_MAG3] == ELFMAG3)
|
return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
|
||||||
&& (e->e_ident[EI_CLASS] == ELFCLASS32)
|
|
||||||
&& (e->e_ident[EI_DATA] == ELFDATA2MSB)
|
|
||||||
&& (e->e_ident[EI_VERSION] == EV_CURRENT)
|
|
||||||
&& (e->e_type == ET_REL) && (e->e_machine == EM_PPC)
|
|
||||||
&& (e->e_version == EV_CURRENT)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Make sure that every section is within the core. */
|
return GRUB_ERR_NONE;
|
||||||
if (size < e->e_shoff + e->e_shentsize * e->e_shnum)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* multiboot.c - boot a multiboot OS image. */
|
/* multiboot.c - boot a multiboot OS image. */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -140,20 +140,18 @@ grub_rescue_cmd_multiboot (int argc, char *argv[])
|
||||||
|
|
||||||
ehdr = (Elf32_Ehdr *) buffer;
|
ehdr = (Elf32_Ehdr *) buffer;
|
||||||
|
|
||||||
if (!((ehdr->e_ident[EI_MAG0] == ELFMAG0)
|
if (grub_dl_check_header (ehdr, sizeof(*ehdr)))
|
||||||
&& (ehdr->e_ident[EI_MAG1] == ELFMAG1)
|
|
||||||
&& (ehdr->e_ident[EI_MAG2] == ELFMAG2)
|
|
||||||
&& (ehdr->e_ident[EI_MAG3] == ELFMAG3)
|
|
||||||
&& (ehdr->e_ident[EI_CLASS] == ELFCLASS32)
|
|
||||||
&& (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
|
|
||||||
&& (ehdr->e_ident[EI_VERSION] == EV_CURRENT)
|
|
||||||
&& (ehdr->e_type == ET_EXEC) && (ehdr->e_machine == EM_386)
|
|
||||||
&& (ehdr->e_version == EV_CURRENT)))
|
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
|
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ehdr->e_type != ET_EXEC)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_UNKNOWN_OS, "invalid ELF file type");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: Should we support program headers at strange locations? */
|
/* FIXME: Should we support program headers at strange locations? */
|
||||||
if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > GRUB_MB_SEARCH)
|
if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > GRUB_MB_SEARCH)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* linux.c - boot Linux */
|
/* linux.c - boot Linux */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -124,15 +124,7 @@ grub_rescue_cmd_linux (int argc, char *argv[])
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!((ehdr.e_ident[EI_MAG0] == ELFMAG0)
|
if (grub_dl_check_header (&ehdr, sizeof(ehdr)))
|
||||||
&& (ehdr.e_ident[EI_MAG1] == ELFMAG1)
|
|
||||||
&& (ehdr.e_ident[EI_MAG2] == ELFMAG2)
|
|
||||||
&& (ehdr.e_ident[EI_MAG3] == ELFMAG3)
|
|
||||||
&& (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
|
|
||||||
&& (ehdr.e_ident[EI_DATA] == ELFDATA2MSB)
|
|
||||||
&& (ehdr.e_ident[EI_VERSION] == EV_CURRENT)
|
|
||||||
&& (ehdr.e_type == ET_EXEC) && (ehdr.e_machine == EM_PPC)
|
|
||||||
&& (ehdr.e_version == EV_CURRENT)))
|
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
|
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -145,20 +137,6 @@ grub_rescue_cmd_linux (int argc, char *argv[])
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ehdr.e_machine != EM_PPC)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_UNKNOWN_OS,
|
|
||||||
"This ELF file is not for the PPC32\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ehdr.e_version != EV_CURRENT)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_UNKNOWN_OS,
|
|
||||||
"Invalid ELF version\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the sections. */
|
/* Read the sections. */
|
||||||
entry = ehdr.e_entry;
|
entry = ehdr.e_entry;
|
||||||
if (entry == 0xc0000000)
|
if (entry == 0xc0000000)
|
||||||
|
|
|
@ -51,11 +51,10 @@ grub_arch_modules_addr (void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
grub_err_t
|
||||||
grub_arch_dl_check_header (void *ehdr, grub_size_t size)
|
grub_arch_dl_check_header (void *ehdr)
|
||||||
{
|
{
|
||||||
(void) ehdr;
|
(void) ehdr;
|
||||||
(void) size;
|
|
||||||
|
|
||||||
return GRUB_ERR_BAD_MODULE;
|
return GRUB_ERR_BAD_MODULE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue