Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | Upstream-Status: Inappropriate [embedded specific] |
| 2 | |
| 3 | Fix problem during parsing of ELF headers for 64bit on big-endian. |
| 4 | Some header fields were read with wrong size. |
| 5 | |
| 6 | 2014/10/24 |
| 7 | Par Olsson <Par.Olsson@windriver.com> |
| 8 | Shan Hai <shan.hai@windriver.com> |
| 9 | |
| 10 | diff --git a/readelflib.c b/readelflib.c |
| 11 | index 3f5b25b..0bf0de3 100644 |
| 12 | --- a/readelflib.c |
| 13 | +++ b/readelflib.c |
| 14 | @@ -261,8 +261,8 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag, |
| 15 | int i; |
| 16 | unsigned int j; |
| 17 | Elf64_Addr loadaddr; |
| 18 | - unsigned int dynamic_addr; |
| 19 | - size_t dynamic_size; |
| 20 | + Elf64_Addr dynamic_addr; |
| 21 | + Elf64_Xword dynamic_size; |
| 22 | char *program_interpreter; |
| 23 | |
| 24 | Elf64_Ehdr *elf_header; |
| 25 | @@ -311,7 +311,7 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag, |
| 26 | error (0, 0, _("more than one dynamic segment\n")); |
| 27 | |
| 28 | dynamic_addr = read64(segment->p_offset, be); |
| 29 | - dynamic_size = read32(segment->p_filesz, be); |
| 30 | + dynamic_size = read64(segment->p_filesz, be); |
| 31 | break; |
| 32 | |
| 33 | case PT_INTERP: |
| 34 | @@ -329,11 +329,11 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag, |
| 35 | break; |
| 36 | |
| 37 | case PT_NOTE: |
| 38 | - if (!*osversion && read32(segment->p_filesz, be) >= 32 && read32(segment->p_align, be) >= 4) |
| 39 | + if (!*osversion && read64(segment->p_filesz, be) >= 32 && read64(segment->p_align, be) >= 4) |
| 40 | { |
| 41 | Elf64_Word *abi_note = (Elf64_Word *) (file_contents |
| 42 | + read64(segment->p_offset, be)); |
| 43 | - Elf64_Addr size = read32(segment->p_filesz, be); |
| 44 | + Elf64_Xword size = read64(segment->p_filesz, be); |
| 45 | |
| 46 | while (read32(abi_note [0], be) != 4 || read32(abi_note [1], be) != 16 |
| 47 | || read32(abi_note [2], be) != 1 |