Commit bd1d6e24 authored by Robin Holt's avatar Robin Holt Committed by Tony Luck

[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: default avatarRobin Holt <holt@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent acb7f672
...@@ -261,8 +261,6 @@ elf32_set_personality (void) ...@@ -261,8 +261,6 @@ elf32_set_personality (void)
{ {
set_personality(PER_LINUX32); set_personality(PER_LINUX32);
current->thread.map_base = IA32_PAGE_OFFSET/3; current->thread.map_base = IA32_PAGE_OFFSET/3;
current->thread.task_size = IA32_PAGE_OFFSET; /* use what Linux/x86 uses... */
set_fs(USER_DS); /* set addr limit for new TASK_SIZE */
} }
static unsigned long static unsigned long
......
...@@ -305,7 +305,6 @@ struct old_linux32_dirent { ...@@ -305,7 +305,6 @@ struct old_linux32_dirent {
#define ELF_DATA ELFDATA2LSB #define ELF_DATA ELFDATA2LSB
#define ELF_ARCH EM_386 #define ELF_ARCH EM_386
#define IA32_PAGE_OFFSET 0xc0000000
#define IA32_STACK_TOP IA32_PAGE_OFFSET #define IA32_STACK_TOP IA32_PAGE_OFFSET
#define IA32_GATE_OFFSET IA32_PAGE_OFFSET #define IA32_GATE_OFFSET IA32_PAGE_OFFSET
#define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE #define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE
......
...@@ -721,8 +721,11 @@ flush_thread (void) ...@@ -721,8 +721,11 @@ flush_thread (void)
/* drop floating-point and debug-register state if it exists: */ /* drop floating-point and debug-register state if it exists: */
current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID); current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
ia64_drop_fpu(current); ia64_drop_fpu(current);
if (IS_IA32_PROCESS(ia64_task_regs(current))) if (IS_IA32_PROCESS(ia64_task_regs(current))) {
ia32_drop_partial_page_list(current); ia32_drop_partial_page_list(current);
current->thread.task_size = IA32_PAGE_OFFSET;
set_fs(USER_DS);
}
} }
/* /*
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
# ifdef CONFIG_IA32_SUPPORT # ifdef CONFIG_IA32_SUPPORT
#define IA32_PAGE_OFFSET 0xc0000000
extern void ia32_cpu_init (void); extern void ia32_cpu_init (void);
extern void ia32_mem_init (void); extern void ia32_mem_init (void);
extern void ia32_gdt_init (void); extern void ia32_gdt_init (void);
......
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