diff options
author | Ben Cheng <bccheng@google.com> | 2012-12-10 14:51:32 -0800 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2012-12-10 14:53:03 -0800 |
commit | 0015a42942d246cc225034b9754bb6d926b16f10 (patch) | |
tree | 03314b6f1682f65df5f8e2871e43b32716b93e7a | |
parent | 777991d9399f1268d27c72a03d56c1a36068a57f (diff) | |
download | system_core-0015a42942d246cc225034b9754bb6d926b16f10.zip system_core-0015a42942d246cc225034b9754bb6d926b16f10.tar.gz system_core-0015a42942d246cc225034b9754bb6d926b16f10.tar.bz2 |
Fix ELF header parser bug.
Program header size should be 32 instead of 40.
Bug: 7696928
Change-Id: I8298a030790e9c28e8e8a0d2ad4e9ef294708eb6
-rw-r--r-- | libcorkscrew/arch-arm/ptrace-arm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libcorkscrew/arch-arm/ptrace-arm.c b/libcorkscrew/arch-arm/ptrace-arm.c index 868230c..78a9ea9 100644 --- a/libcorkscrew/arch-arm/ptrace-arm.c +++ b/libcorkscrew/arch-arm/ptrace-arm.c @@ -29,12 +29,15 @@ static void load_exidx_header(pid_t pid, map_info_t* mi, uintptr_t* out_exidx_start, size_t* out_exidx_size) { uint32_t elf_phoff; - uint32_t elf_phentsize_phnum; + uint32_t elf_phentsize_ehsize; + uint32_t elf_shentsize_phnum; if (try_get_word_ptrace(pid, mi->start + offsetof(Elf32_Ehdr, e_phoff), &elf_phoff) + && try_get_word_ptrace(pid, mi->start + offsetof(Elf32_Ehdr, e_ehsize), + &elf_phentsize_ehsize) && try_get_word_ptrace(pid, mi->start + offsetof(Elf32_Ehdr, e_phnum), - &elf_phentsize_phnum)) { - uint32_t elf_phentsize = elf_phentsize_phnum >> 16; - uint32_t elf_phnum = elf_phentsize_phnum & 0xffff; + &elf_shentsize_phnum)) { + uint32_t elf_phentsize = elf_phentsize_ehsize >> 16; + uint32_t elf_phnum = elf_shentsize_phnum & 0xffff; for (uint32_t i = 0; i < elf_phnum; i++) { uintptr_t elf_phdr = mi->start + elf_phoff + i * elf_phentsize; uint32_t elf_phdr_type; |