* 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-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>
* conf/powerpc-ieee1275.rmk (pkgdata_MODULES): Add ls.mod.
/* dl.h - types and prototypes for loadable module support */
/*
* 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
* it under the terms of the GNU General Public License as published by
};
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) (const char *name);
grub_dl_t grub_dl_load_core (void *addr, grub_size_t size);
grub_dl_t mod);
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);
#endif /* ! GRUB_DL_H */
/* 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
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)
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;
/* dl-386.c - arch-dependent part of loadable module support */
/*
* 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
* it under the terms of the GNU General Public License as published by
#include <grub/err.h>
/* Check if EHDR is a valid ELF header. */
-int
-grub_arch_dl_check_header (void *ehdr, grub_size_t size)
+grub_err_t
+grub_arch_dl_check_header (void *ehdr)
{
Elf32_Ehdr *e = ehdr;
- /* Check the header size. */
- if (size < sizeof (Elf32_Ehdr))
- return 0;
-
/* Check the magic numbers. */
- if (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_version != EV_CURRENT
- || e->e_ident[EI_CLASS] != ELFCLASS32
+ if (e->e_ident[EI_CLASS] != ELFCLASS32
|| e->e_ident[EI_DATA] != ELFDATA2LSB
- || e->e_machine != EM_386
- || e->e_type != ET_REL)
- return 0;
+ || e->e_machine != EM_386)
+ return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
- /* Make sure that every section is within the core. */
- if (size < e->e_shoff + e->e_shentsize * e->e_shnum)
- return 0;
-
- return 1;
+ return GRUB_ERR_NONE;
}
/* Relocate symbols. */
/* dl.c - arch-dependent part of loadable module support */
/*
* 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
* it under the terms of the GNU General Public License as published by
#include <grub/err.h>
/* Check if EHDR is a valid ELF header. */
-int
-grub_arch_dl_check_header (void *ehdr, grub_size_t size)
+grub_err_t
+grub_arch_dl_check_header (void *ehdr)
{
Elf32_Ehdr *e = ehdr;
- /* Check the header size. */
- if (size < sizeof (Elf32_Ehdr))
- return 0;
-
/* Check the magic numbers. */
- if (!((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_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. */
- if (size < e->e_shoff + e->e_shentsize * e->e_shnum)
- return 0;
+ if (e->e_ident[EI_CLASS] != ELFCLASS32
+ || e->e_ident[EI_DATA] != ELFDATA2MSB
+ || e->e_machine != EM_PPC)
+ return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
- return 1;
+ return GRUB_ERR_NONE;
}
/* multiboot.c - boot a multiboot OS image. */
/*
* 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
* it under the terms of the GNU General Public License as published by
ehdr = (Elf32_Ehdr *) buffer;
- if (!((ehdr->e_ident[EI_MAG0] == ELFMAG0)
- && (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)))
+ if (grub_dl_check_header (ehdr, sizeof(*ehdr)))
{
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
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? */
if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > GRUB_MB_SEARCH)
{
/* linux.c - boot Linux */
/*
* 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
* it under the terms of the GNU General Public License as published by
goto fail;
}
- if (!((ehdr.e_ident[EI_MAG0] == ELFMAG0)
- && (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)))
+ if (grub_dl_check_header (&ehdr, sizeof(ehdr)))
{
grub_error (GRUB_ERR_UNKNOWN_OS, "No valid ELF header found");
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. */
entry = ehdr.e_entry;
if (entry == 0xc0000000)
return 0;
}
-int
-grub_arch_dl_check_header (void *ehdr, grub_size_t size)
+grub_err_t
+grub_arch_dl_check_header (void *ehdr)
{
(void) ehdr;
- (void) size;
return GRUB_ERR_BAD_MODULE;
}