mirror of git://sourceware.org/git/glibc.git
Future safety in checking ELF header.
If we should use further fields in the e_ident array in the ELF header of files we want zero to mean the default. Enforce zero for now so that non-optional features indicated by nonzero values are not go unnoticed when using an old dynamic linker.
This commit is contained in:
parent
b170ff0f8f
commit
04f2902d9f
|
|
@ -1,3 +1,9 @@
|
||||||
|
2010-03-18 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* elf/dl-load.c (open_verify): Extend expected to the full size of the
|
||||||
|
e_ident array. When loading, check that the fields in e_ident we don't
|
||||||
|
know are zero to allow future extensions.
|
||||||
|
|
||||||
2010-03-18 H.J. Lu <hongjiu.lu@intel.com>
|
2010-03-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* sysdeps/i386/i686/multiarch/memcmp-ssse3.S: Update %xmm3
|
* sysdeps/i386/i686/multiarch/memcmp-ssse3.S: Update %xmm3
|
||||||
|
|
|
||||||
|
|
@ -1573,7 +1573,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
|
||||||
#elif defined MORE_ELF_HEADER_DATA
|
#elif defined MORE_ELF_HEADER_DATA
|
||||||
MORE_ELF_HEADER_DATA;
|
MORE_ELF_HEADER_DATA;
|
||||||
#endif
|
#endif
|
||||||
static const unsigned char expected[EI_PAD] =
|
static const unsigned char expected[EI_NIDENT] =
|
||||||
{
|
{
|
||||||
[EI_MAG0] = ELFMAG0,
|
[EI_MAG0] = ELFMAG0,
|
||||||
[EI_MAG1] = ELFMAG1,
|
[EI_MAG1] = ELFMAG1,
|
||||||
|
|
@ -1657,7 +1657,10 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
|
||||||
if (__builtin_expect (! VALID_ELF_HEADER (ehdr->e_ident, expected,
|
if (__builtin_expect (! VALID_ELF_HEADER (ehdr->e_ident, expected,
|
||||||
EI_ABIVERSION)
|
EI_ABIVERSION)
|
||||||
|| !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
|
|| !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
|
||||||
ehdr->e_ident[EI_ABIVERSION]),
|
ehdr->e_ident[EI_ABIVERSION])
|
||||||
|
|| memcmp (&ehdr->e_ident[EI_PAD],
|
||||||
|
&expected[EI_PAD],
|
||||||
|
EI_NIDENT - EI_PAD) != 0,
|
||||||
0))
|
0))
|
||||||
{
|
{
|
||||||
/* Something is wrong. */
|
/* Something is wrong. */
|
||||||
|
|
@ -1701,6 +1704,9 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
|
||||||
else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
|
else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
|
||||||
ehdr->e_ident[EI_ABIVERSION]))
|
ehdr->e_ident[EI_ABIVERSION]))
|
||||||
errstring = N_("ELF file ABI version invalid");
|
errstring = N_("ELF file ABI version invalid");
|
||||||
|
else if (memcmp (&ehdr->e_ident[EI_PAD], &expected[EI_PAD],
|
||||||
|
EI_NIDENT - EI_PAD) != 0)
|
||||||
|
errstring = N_("nonzero padding in e_ident");
|
||||||
else
|
else
|
||||||
/* Otherwise we don't know what went wrong. */
|
/* Otherwise we don't know what went wrong. */
|
||||||
errstring = N_("internal error");
|
errstring = N_("internal error");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue