diff options
author | Peter Maydell | 2017-11-21 11:44:44 +0100 |
---|---|---|
committer | Peter Maydell | 2017-11-21 11:44:44 +0100 |
commit | 1b4e6e8cf8d8ff6ba3fd71eb41051ac2621ace7e (patch) | |
tree | 70c2412a1fa690704940af86d2c71d19ee626b63 /linux-user/elfload.c | |
parent | Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20171120'... (diff) | |
parent | linux-user: Fix calculation of auxv length (diff) | |
download | qemu-1b4e6e8cf8d8ff6ba3fd71eb41051ac2621ace7e.tar.gz qemu-1b4e6e8cf8d8ff6ba3fd71eb41051ac2621ace7e.tar.xz qemu-1b4e6e8cf8d8ff6ba3fd71eb41051ac2621ace7e.zip |
Merge remote-tracking branch 'remotes/riku/tags/pull-linux-user-20171120' into staging
late linux-user fixes for Qemu 2.11
# gpg: Signature made Mon 20 Nov 2017 21:19:00 GMT
# gpg: using RSA key 0xB44890DEDE3C9BC0
# gpg: Good signature from "Riku Voipio <riku.voipio@iki.fi>"
# gpg: aka "Riku Voipio <riku.voipio@linaro.org>"
# Primary key fingerprint: FF82 03C8 C391 98AE 0581 41EF B448 90DE DE3C 9BC0
* remotes/riku/tags/pull-linux-user-20171120:
linux-user: Fix calculation of auxv length
linux-user: Handle rt_sigaction correctly for SPARC
linux-user/sparc: Put address for data faults where linux-user expects it
linux-user/ppc: Report correct fault address for data faults
linux-user/s390x: Mask si_addr for SIGSEGV
linux-user: return EINVAL from prctl(PR_*_SECCOMP)
linux-user: fix 'finshed' typo in comment
linux-user/syscall.c: Handle SH4's exceptional alignment for p{read, write}64
linux-user: Handle TARGET_MAP_STACK and TARGET_MAP_HUGETLB
linux-user/hppa: Fix TARGET_F_RDLCK, TARGET_F_WRLCK, TARGET_F_UNLCK
linux-user/hppa: Fix TARGET_MAP_TYPE
linux-user/hppa: Fix typo for TARGET_NR_epoll_wait
linux-user/hppa: Fix cpu_clone_regs
linux-user/hppa: Fix TARGET_SA_* defines
linux-user: Restrict usage of sa_restorer
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user/elfload.c')
-rw-r--r-- | linux-user/elfload.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 3b857fbc9c..20f3d8c2c3 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1732,6 +1732,8 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, #ifdef ELF_HWCAP2 size += 2; #endif + info->auxv_len = size * n; + size += envc + argc + 2; size += 1; /* argc itself */ size *= n; @@ -1760,7 +1762,6 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, put_user_ual(val, u_auxv); u_auxv += n; \ } while(0) - /* There must be exactly DLINFO_ITEMS entries here. */ #ifdef ARCH_DLINFO /* * ARCH_DLINFO must come first so platform specific code can enforce @@ -1768,6 +1769,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, */ ARCH_DLINFO; #endif + /* There must be exactly DLINFO_ITEMS entries here, or the assert + * on info->auxv_len will trigger. + */ NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff)); NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr))); NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum)); @@ -1793,7 +1797,10 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, NEW_AUX_ENT (AT_NULL, 0); #undef NEW_AUX_ENT - info->auxv_len = u_argv - info->saved_auxv; + /* Check that our initial calculation of the auxv length matches how much + * we actually put into it. + */ + assert(info->auxv_len == u_auxv - info->saved_auxv); put_user_ual(argc, u_argc); |