Commit 5fd43b38 authored by David S. Miller's avatar David S. Miller

[ELF]: Handle auxv bits more cleanly in mixed 32/64 bit environments.

parent d302b497
...@@ -169,7 +169,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -169,7 +169,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
} }
/* Create the ELF interpreter info */ /* Create the ELF interpreter info */
elf_info = current->mm->saved_auxv; elf_info = (elf_addr_t *) current->mm->saved_auxv;
#define NEW_AUX_ENT(id, val) \ #define NEW_AUX_ENT(id, val) \
do { elf_info[ei_index++] = id; elf_info[ei_index++] = val; } while (0) do { elf_info[ei_index++] = id; elf_info[ei_index++] = val; } while (0)
...@@ -197,8 +197,10 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -197,8 +197,10 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
if (k_platform) { if (k_platform) {
NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform); NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform);
} }
NEW_AUX_ENT(AT_NULL, 0);
#undef NEW_AUX_ENT #undef NEW_AUX_ENT
/* AT_NULL is zero; clear the rest too */
memset(&elf_info[ei_index], 0,
sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
sp = STACK_ADD(p, ei_index); sp = STACK_ADD(p, ei_index);
...@@ -1209,6 +1211,7 @@ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file) ...@@ -1209,6 +1211,7 @@ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file)
elf_fpxregset_t *xfpu = NULL; elf_fpxregset_t *xfpu = NULL;
#endif #endif
int thread_status_size = 0; int thread_status_size = 0;
elf_addr_t *auxv;
/* /*
* We no longer stop all VM operations. * We no longer stop all VM operations.
...@@ -1290,13 +1293,14 @@ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file) ...@@ -1290,13 +1293,14 @@ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file)
numnote = 3; numnote = 3;
auxv = (elf_addr_t *) current->mm->saved_auxv;
i = 0; i = 0;
do do
i += 2; i += 2;
while (current->mm->saved_auxv[i - 2] != AT_NULL); while (auxv[i - 2] != AT_NULL);
fill_note(&notes[numnote++], "CORE", NT_AUXV, fill_note(&notes[numnote++], "CORE", NT_AUXV,
i * sizeof current->mm->saved_auxv[0], i * sizeof (elf_addr_t), auxv);
current->mm->saved_auxv);
/* Try to dump the FPU. */ /* Try to dump the FPU. */
if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, fpu))) if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, fpu)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment