Commit 768a4a36a444ef5aef1f103adf42553eadfe4614
1 parent
0d3267a7
Fix userland ELF loader for zero sized BSS.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2244 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
6 additions
and
3 deletions
linux-user/elfload.c
| @@ -553,10 +553,13 @@ static void set_brk(unsigned long start, unsigned long end) | @@ -553,10 +553,13 @@ static void set_brk(unsigned long start, unsigned long end) | ||
| 553 | /* We need to explicitly zero any fractional pages after the data | 553 | /* We need to explicitly zero any fractional pages after the data |
| 554 | section (i.e. bss). This would contain the junk from the file that | 554 | section (i.e. bss). This would contain the junk from the file that |
| 555 | should not be in memory. */ | 555 | should not be in memory. */ |
| 556 | -static void padzero(unsigned long elf_bss) | 556 | +static void padzero(unsigned long elf_bss, unsigned long last_bss) |
| 557 | { | 557 | { |
| 558 | unsigned long nbyte; | 558 | unsigned long nbyte; |
| 559 | 559 | ||
| 560 | + if (elf_bss >= last_bss) | ||
| 561 | + return; | ||
| 562 | + | ||
| 560 | /* XXX: this is really a hack : if the real host page size is | 563 | /* XXX: this is really a hack : if the real host page size is |
| 561 | smaller than the target page size, some pages after the end | 564 | smaller than the target page size, some pages after the end |
| 562 | of the file may not be mapped. A better fix would be to | 565 | of the file may not be mapped. A better fix would be to |
| @@ -798,7 +801,7 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, | @@ -798,7 +801,7 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, | ||
| 798 | * that there are zeromapped pages up to and including the last | 801 | * that there are zeromapped pages up to and including the last |
| 799 | * bss page. | 802 | * bss page. |
| 800 | */ | 803 | */ |
| 801 | - padzero(elf_bss); | 804 | + padzero(elf_bss, last_bss); |
| 802 | elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */ | 805 | elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */ |
| 803 | 806 | ||
| 804 | /* Map the last of the bss segment */ | 807 | /* Map the last of the bss segment */ |
| @@ -1227,7 +1230,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, | @@ -1227,7 +1230,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, | ||
| 1227 | sections */ | 1230 | sections */ |
| 1228 | set_brk(elf_bss, elf_brk); | 1231 | set_brk(elf_bss, elf_brk); |
| 1229 | 1232 | ||
| 1230 | - padzero(elf_bss); | 1233 | + padzero(elf_bss, elf_brk); |
| 1231 | 1234 | ||
| 1232 | #if 0 | 1235 | #if 0 |
| 1233 | printf("(start_brk) %x\n" , info->start_brk); | 1236 | printf("(start_brk) %x\n" , info->start_brk); |