]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libelf: Take map offset into account for Shdr alignment check in elf_begin
authorMark Wielaard <mark@klomp.org>
Thu, 17 Mar 2022 12:58:56 +0000 (13:58 +0100)
committerMark Wielaard <mark@klomp.org>
Thu, 17 Mar 2022 23:54:51 +0000 (00:54 +0100)
The sh_num function tries to get at the zero section Shdr directly.
When the file is mmapped it has to make sure the offset into the file
to the start of the Elf structure is taken into account when trying to
cast the address to make sure the alignment is correct.

Signed-off-by: Mark Wielaard <mark@klomp.org>
libelf/ChangeLog
libelf/elf_begin.c

index 29a8aae1a742a41f43c8bafd6fe85cfb9a4906b1..1883af0725dd15deab55c9eb2f18434773a2c77f 100644 (file)
@@ -1,3 +1,8 @@
+2022-03-17  Mark Wielaard  <mark@klomp.org>
+
+       * elf_begin.c (get_shnum): Take offset into account for Shdr
+       alignment check.
+
 2021-12-19  Mark Wielaard  <mark@klomp.org>
 
        * elf_begin.c (file_read_elf): Cast ehdr to uintptr_t before e_shoff
index 0c9a988d6d2cb1186da7c837ea58e48ced930e44..53bbff4077b82fa8dd06845b06e79c23fb819a1e 100644 (file)
@@ -1,6 +1,6 @@
 /* Create descriptor for processing file.
    Copyright (C) 1998-2010, 2012, 2014, 2015, 2016 Red Hat, Inc.
-   Copyright (C) 2021 Mark J. Wielaard <mark@klomp.org>
+   Copyright (C) 2021, 2022 Mark J. Wielaard <mark@klomp.org>
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -158,7 +158,8 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes,
 
          if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
              && (ALLOW_UNALIGNED
-                 || (((size_t) ((char *) map_address + ehdr.e32->e_shoff))
+                 || (((size_t) ((char *) (map_address + ehdr.e32->e_shoff
+                                          + offset)))
                      & (__alignof__ (Elf32_Shdr) - 1)) == 0))
            /* We can directly access the memory.  */
            result = ((Elf32_Shdr *) ((char *) map_address + ehdr.e32->e_shoff
@@ -218,7 +219,8 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes,
          Elf64_Xword size;
          if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
              && (ALLOW_UNALIGNED
-                 || (((size_t) ((char *) map_address + ehdr.e64->e_shoff))
+                 || (((size_t) ((char *) (map_address + ehdr.e64->e_shoff
+                                          + offset)))
                      & (__alignof__ (Elf64_Shdr) - 1)) == 0))
            /* We can directly access the memory.  */
            size = ((Elf64_Shdr *) ((char *) map_address + ehdr.e64->e_shoff