On Mon, 03 Mar 2014 15:31:27 +0100, Mark Wielaard wrote:
--- a/libdwfl/elf-from-memory.c
+++ b/libdwfl/elf-from-memory.c
[...]
@@ -195,21 +200,28 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
bool found_base = false;
switch (ehdr.e32.e_ident[EI_CLASS])
{
The return value could be documented.
- inline void handle_segment (GElf_Addr vaddr, GElf_Off offset,
- GElf_Xword filesz, GElf_Xword align)
+ inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
+ GElf_Xword filesz, GElf_Xword palign)
{
- GElf_Off segment_end = ((offset + filesz + align - 1) & -align);
+ /* Sanity check the alignment requirements. */
+ if ((palign & (pagesize - 1)) != 0
+ || ((vaddr - offset) & (palign - 1)) != 0)
+ return true;
+
+ GElf_Off segment_end = ((offset + filesz + pagesize - 1)
+ & -pagesize);
if (segment_end > (GElf_Off) contents_size)
contents_size = segment_end;
- if (!found_base && (offset & -align) == 0)
+ if (!found_base && (offset & -pagesize) == 0)
{
- loadbase = ehdr_vma - (vaddr & -align);
+ loadbase = ehdr_vma - (vaddr & -pagesize);
found_base = true;
}
segments_end = offset + filesz;
+ return false;
}
case ELFCLASS32:
I agree with the patch.
Thanks,
Jan