From d8c47894ca28d5c5cf396aa271c579d41f21c1d4 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 16 Mar 2010 23:34:59 -0700 Subject: [PATCH] Extended ELF ABI version handling only for Linux. If the OSABI is generic we should not allow the ABI version to be nonzero. Move all the new functionality into Linux-specific files. --- ChangeLog | 10 ++++++++++ elf/dl-load.c | 8 +++++--- sysdeps/unix/sysv/linux/ldsodefs.h | 9 +++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed27976ad6..a8eba156a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2010-03-16 Ulrich Drepper + * elf/dl-load.c (VALID_ELF_ABIVERSION): Add additional osabi parameter. + Not used here. + (open_verify): Modify for extended VALID_ELF_ABIVERSION macro + interface. + * sysdeps/unix/sysv/linux/ldsodefs.h (VALID_ELF_ABIVERSION): Add + additional osabi parameter. Only acceept nonzero ABI versions if osabi + is Linux. + Fix includes. + (expected2): Don't explicitly initialize EI_ABIVERSION byte. + * sysdeps/unix/sysv/linux/ldsodefs.h (VALID_ELF_ABIVERSION): Update definition to follow generic code. diff --git a/elf/dl-load.c b/elf/dl-load.c index 1cfab353d0..756816f25f 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1569,7 +1569,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, #ifndef VALID_ELF_HEADER # define VALID_ELF_HEADER(hdr,exp,size) (memcmp (hdr, exp, size) == 0) # define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV) -# define VALID_ELF_ABIVERSION(ver) (ver < LIBC_ABI_MAX) +# define VALID_ELF_ABIVERSION(osabi,ver) (ver == 0) #elif defined MORE_ELF_HEADER_DATA MORE_ELF_HEADER_DATA; #endif @@ -1656,7 +1656,8 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, /* See whether the ELF header is what we expect. */ if (__builtin_expect (! VALID_ELF_HEADER (ehdr->e_ident, expected, EI_ABIVERSION) - || !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION]), + || !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI], + ehdr->e_ident[EI_ABIVERSION]), 0)) { /* Something is wrong. */ @@ -1697,7 +1698,8 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, allowed here. */ else if (!VALID_ELF_OSABI (ehdr->e_ident[EI_OSABI])) errstring = N_("ELF file OS ABI invalid"); - else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION])) + else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI], + ehdr->e_ident[EI_ABIVERSION])) errstring = N_("ELF file ABI version invalid"); else /* Otherwise we don't know what went wrong. */ diff --git a/sysdeps/unix/sysv/linux/ldsodefs.h b/sysdeps/unix/sysv/linux/ldsodefs.h index 438c9e0c8d..5d5b1b4c06 100644 --- a/sysdeps/unix/sysv/linux/ldsodefs.h +++ b/sysdeps/unix/sysv/linux/ldsodefs.h @@ -1,5 +1,5 @@ /* Run-time dynamic linker data structures for loaded ELF shared objects. - Copyright (C) 2001, 2002, 2003, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2006, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,6 +19,7 @@ #ifndef _LDSODEFS_H +#include #include /* Get the real definitions. */ @@ -58,7 +59,8 @@ extern void _dl_non_dynamic_init (void) internal_function; || memcmp (hdr, expected2, size) == 0) #define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV \ || osabi == ELFOSABI_LINUX) -#define VALID_ELF_ABIVERSION(ver) (ver < LIBC_ABI_MAX) +#define VALID_ELF_ABIVERSION(osabi,ver) \ + (ver == 0 || (osabi == ELFOSABI_LINUX && ver < LIBC_ABI_MAX)) #define MORE_ELF_HEADER_DATA \ static const unsigned char expected2[EI_PAD] = \ { \ @@ -69,8 +71,7 @@ extern void _dl_non_dynamic_init (void) internal_function; [EI_CLASS] = ELFW(CLASS), \ [EI_DATA] = byteorder, \ [EI_VERSION] = EV_CURRENT, \ - [EI_OSABI] = ELFOSABI_LINUX, \ - [EI_ABIVERSION] = 0 \ + [EI_OSABI] = ELFOSABI_LINUX \ } #endif /* ldsodefs.h */