diff options
author | Robin Holt <holt@sgi.com> | 2005-12-05 21:02:31 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-12-06 12:12:34 -0500 |
commit | bd1d6e2451f2bb0132416fda4d129c4f57a827bc (patch) | |
tree | 64fc1ba7d4734ea5ecec8942795b32a32e4623a4 /arch/ia64/ia32 | |
parent | acb7f67280128a9ddaa756ff10212391d28caec4 (diff) |
[IA64] Change SET_PERSONALITY to comply with comment in binfmt_elf.c.
We have a customer application which trips a bug. The problem arises
when a driver attempts to call do_munmap on an area which is mapped, but
because current->thread.task_size has been set to 0xC0000000, the call
to do_munmap fails thinking it is an unmap beyond the user's address
space.
The comment in fs/binfmt_elf.c in load_elf_library() before the call
to SET_PERSONALITY() indicates that task_size must not be changed for
the running application until flush_thread, but is for ia64 executing
ia32 binaries.
This patch moves the setting of task_size from SET_PERSONALITY() to
flush_thread() as indicated. The customer application no longer is able
to trip the bug.
Signed-off-by: Robin Holt <holt@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/ia32')
-rw-r--r-- | arch/ia64/ia32/binfmt_elf32.c | 2 | ||||
-rw-r--r-- | arch/ia64/ia32/ia32priv.h | 1 |
2 files changed, 0 insertions, 3 deletions
diff --git a/arch/ia64/ia32/binfmt_elf32.c b/arch/ia64/ia32/binfmt_elf32.c index a7280d9f6c16..4e7a6a1ec6c7 100644 --- a/arch/ia64/ia32/binfmt_elf32.c +++ b/arch/ia64/ia32/binfmt_elf32.c | |||
@@ -261,8 +261,6 @@ elf32_set_personality (void) | |||
261 | { | 261 | { |
262 | set_personality(PER_LINUX32); | 262 | set_personality(PER_LINUX32); |
263 | current->thread.map_base = IA32_PAGE_OFFSET/3; | 263 | current->thread.map_base = IA32_PAGE_OFFSET/3; |
264 | current->thread.task_size = IA32_PAGE_OFFSET; /* use what Linux/x86 uses... */ | ||
265 | set_fs(USER_DS); /* set addr limit for new TASK_SIZE */ | ||
266 | } | 264 | } |
267 | 265 | ||
268 | static unsigned long | 266 | static unsigned long |
diff --git a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h index e3e9290e3ff2..68ceb4e690c7 100644 --- a/arch/ia64/ia32/ia32priv.h +++ b/arch/ia64/ia32/ia32priv.h | |||
@@ -305,7 +305,6 @@ struct old_linux32_dirent { | |||
305 | #define ELF_DATA ELFDATA2LSB | 305 | #define ELF_DATA ELFDATA2LSB |
306 | #define ELF_ARCH EM_386 | 306 | #define ELF_ARCH EM_386 |
307 | 307 | ||
308 | #define IA32_PAGE_OFFSET 0xc0000000 | ||
309 | #define IA32_STACK_TOP IA32_PAGE_OFFSET | 308 | #define IA32_STACK_TOP IA32_PAGE_OFFSET |
310 | #define IA32_GATE_OFFSET IA32_PAGE_OFFSET | 309 | #define IA32_GATE_OFFSET IA32_PAGE_OFFSET |
311 | #define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE | 310 | #define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE |