diff options
author | Ulrich Drepper <drepper@redhat.com> | 2010-03-18 13:15:27 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2010-03-18 13:15:27 -0700 |
commit | 04f2902d9fadb2b8221162247412fb2c4667d95e (patch) | |
tree | af23898e6bc77fb23b49bafb54a2f251da96f372 /elf/dl-load.c | |
parent | b170ff0f8fb25d43dc6d6e9484fc33234110fd8d (diff) | |
download | glibc-04f2902d9fadb2b8221162247412fb2c4667d95e.zip glibc-04f2902d9fadb2b8221162247412fb2c4667d95e.tar.gz glibc-04f2902d9fadb2b8221162247412fb2c4667d95e.tar.bz2 |
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.
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r-- | elf/dl-load.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 756816f..d8f9131 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1573,7 +1573,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, #elif defined MORE_ELF_HEADER_DATA MORE_ELF_HEADER_DATA; #endif - static const unsigned char expected[EI_PAD] = + static const unsigned char expected[EI_NIDENT] = { [EI_MAG0] = ELFMAG0, [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, EI_ABIVERSION) || !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)) { /* 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], ehdr->e_ident[EI_ABIVERSION])) 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 /* Otherwise we don't know what went wrong. */ errstring = N_("internal error"); |