endian-ness_handling_fix.patch 1.6 KB

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