Commit 4118a97030aa9bd1d520d1d06bbe0655d829df04
1 parent
52621688
memset string pages to zero to avoid putting random data on the stack
that may make some program crash at startup. Fix unsigned long / target_ulong confusion (more to do). Fix missing g2h macros. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3249 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
5 additions
and
4 deletions
linux-user/elfload.c
| @@ -517,7 +517,7 @@ static void bswap_sym(struct elf_sym *sym) | @@ -517,7 +517,7 @@ static void bswap_sym(struct elf_sym *sym) | ||
| 517 | * | 517 | * |
| 518 | */ | 518 | */ |
| 519 | static unsigned long copy_elf_strings(int argc,char ** argv, void **page, | 519 | static unsigned long copy_elf_strings(int argc,char ** argv, void **page, |
| 520 | - unsigned long p) | 520 | + target_ulong p) |
| 521 | { | 521 | { |
| 522 | char *tmp, *tmp1, *pag = NULL; | 522 | char *tmp, *tmp1, *pag = NULL; |
| 523 | int len, offset = 0; | 523 | int len, offset = 0; |
| @@ -544,6 +544,7 @@ static unsigned long copy_elf_strings(int argc,char ** argv, void **page, | @@ -544,6 +544,7 @@ static unsigned long copy_elf_strings(int argc,char ** argv, void **page, | ||
| 544 | pag = (char *)page[p/TARGET_PAGE_SIZE]; | 544 | pag = (char *)page[p/TARGET_PAGE_SIZE]; |
| 545 | if (!pag) { | 545 | if (!pag) { |
| 546 | pag = (char *)malloc(TARGET_PAGE_SIZE); | 546 | pag = (char *)malloc(TARGET_PAGE_SIZE); |
| 547 | + memset(pag, 0, TARGET_PAGE_SIZE); | ||
| 547 | page[p/TARGET_PAGE_SIZE] = pag; | 548 | page[p/TARGET_PAGE_SIZE] = pag; |
| 548 | if (!pag) | 549 | if (!pag) |
| 549 | return 0; | 550 | return 0; |
linux-user/mmap.c
| @@ -224,9 +224,9 @@ abort(); | @@ -224,9 +224,9 @@ abort(); | ||
| 224 | start = HOST_PAGE_ALIGN(real_start); | 224 | start = HOST_PAGE_ALIGN(real_start); |
| 225 | end = start + HOST_PAGE_ALIGN(len); | 225 | end = start + HOST_PAGE_ALIGN(len); |
| 226 | if (start > real_start) | 226 | if (start > real_start) |
| 227 | - munmap((void *)real_start, start - real_start); | 227 | + munmap((void *)g2h(real_start), start - real_start); |
| 228 | if (end < real_end) | 228 | if (end < real_end) |
| 229 | - munmap((void *)end, real_end - end); | 229 | + munmap((void *)g2h(end), real_end - end); |
| 230 | /* use it as a fixed mapping */ | 230 | /* use it as a fixed mapping */ |
| 231 | flags |= MAP_FIXED; | 231 | flags |= MAP_FIXED; |
| 232 | } else { | 232 | } else { |
| @@ -370,7 +370,7 @@ int target_munmap(target_ulong start, target_ulong len) | @@ -370,7 +370,7 @@ int target_munmap(target_ulong start, target_ulong len) | ||
| 370 | 370 | ||
| 371 | /* unmap what we can */ | 371 | /* unmap what we can */ |
| 372 | if (real_start < real_end) { | 372 | if (real_start < real_end) { |
| 373 | - ret = munmap((void *)real_start, real_end - real_start); | 373 | + ret = munmap(g2h(real_start), real_end - real_start); |
| 374 | if (ret != 0) | 374 | if (ret != 0) |
| 375 | return ret; | 375 | return ret; |
| 376 | } | 376 | } |