]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Extended ELF ABI version handling only for Linux.
authorUlrich Drepper <drepper@redhat.com>
Wed, 17 Mar 2010 06:34:59 +0000 (23:34 -0700)
committerUlrich Drepper <drepper@redhat.com>
Wed, 17 Mar 2010 06:34:59 +0000 (23:34 -0700)
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
elf/dl-load.c
sysdeps/unix/sysv/linux/ldsodefs.h

index ed27976ad63e070bb8ddb9df3afe816231e5366b..a8eba156a8a64a5a7f07c8f1b682924439d7bda4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2010-03-16  Ulrich Drepper  <drepper@redhat.com>
 
+       * 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.
 
index 1cfab353d02184a007b6adc9fdf52567aea139f2..756816f25fee634dc0726a7d0fae305b482ad93c 100644 (file)
@@ -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.  */
index 438c9e0c8dabcedafed9a7134c4cb91567c5427c..5d5b1b4c06dee5daf1c34b2e223491518cc7f82f 100644 (file)
@@ -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 <libc-abis.h>
 #include <kernel-features.h>
 
 /* 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 */