Re: Additional info on modpost segfault

From: alan
Date: Thu Jun 10 2010 - 20:06:40 EST


On Fri, 11 Jun 2010, Krzysztof Halasa wrote:

Alan <alan@xxxxxxxxxxxxxx> writes:

program: /home/alan/GitTrees/linux-2.6-mid-ref/scripts/mod/modpost -o
Module.symvers -S vmlinux.o

Program received signal SIGSEGV, Segmentation fault.

It just hit me.
It's the offset calculation in reloc_location() which overflows:
return (void *)elf->hdr + sechdrs[section].sh_offset +
(r->r_offset - sechdrs[section].sh_addr);

E.g. for the first rodata r entry:
r->r_offset < sechdrs[section].sh_addr
and the expression in the parenthesis produces 0xFFFFFFE0 or something
equally wise.

Does the attached patch fix it?

YES!

Thank you!

Now the big question is why does this compile on older versions of gcc?

This needs to get added into 2.6.35-rc2.



Signed-off-by: Krzysztof Haÿÿasa <khc@xxxxxxxxx>

--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1317,8 +1317,8 @@ static unsigned int *reloc_location(struct elf_info *elf,
Elf_Shdr *sechdrs = elf->sechdrs;
int section = sechdr->sh_info;

return (void *)elf->hdr + sechdrs[section].sh_offset +
- (r->r_offset - sechdrs[section].sh_addr);
+ r->r_offset - sechdrs[section].sh_addr;
}

static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


--
Truth is stranger than fiction because fiction has to make sense.