1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- Upstream-Status: Inappropriate [embedded specific]
- Fix problem during parsing of ELF headers for 64bit on big-endian.
- Some header fields were read with wrong size.
- 2014/10/24
- Par Olsson <Par.Olsson@windriver.com>
- Shan Hai <shan.hai@windriver.com>
- diff --git a/readelflib.c b/readelflib.c
- index 3f5b25b..0bf0de3 100644
- --- a/readelflib.c
- +++ b/readelflib.c
- @@ -261,8 +261,8 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
- int i;
- unsigned int j;
- Elf64_Addr loadaddr;
- - unsigned int dynamic_addr;
- - size_t dynamic_size;
- + Elf64_Addr dynamic_addr;
- + Elf64_Xword dynamic_size;
- char *program_interpreter;
-
- Elf64_Ehdr *elf_header;
- @@ -311,7 +311,7 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
- error (0, 0, _("more than one dynamic segment\n"));
-
- dynamic_addr = read64(segment->p_offset, be);
- - dynamic_size = read32(segment->p_filesz, be);
- + dynamic_size = read64(segment->p_filesz, be);
- break;
-
- case PT_INTERP:
- @@ -329,11 +329,11 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
- break;
-
- case PT_NOTE:
- - if (!*osversion && read32(segment->p_filesz, be) >= 32 && read32(segment->p_align, be) >= 4)
- + if (!*osversion && read64(segment->p_filesz, be) >= 32 && read64(segment->p_align, be) >= 4)
- {
- Elf64_Word *abi_note = (Elf64_Word *) (file_contents
- + read64(segment->p_offset, be));
- - Elf64_Addr size = read32(segment->p_filesz, be);
- + Elf64_Xword size = read64(segment->p_filesz, be);
-
- while (read32(abi_note [0], be) != 4 || read32(abi_note [1], be) != 16
- || read32(abi_note [2], be) != 1
|