[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>

authored by Robin Holt and committed by Tony Luck bd1d6e24 acb7f672

+6 -4
-2
arch/ia64/ia32/binfmt_elf32.c
··· 261 261 { 262 262 set_personality(PER_LINUX32); 263 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 266 static unsigned long
-1
arch/ia64/ia32/ia32priv.h
··· 305 305 #define ELF_DATA ELFDATA2LSB 306 306 #define ELF_ARCH EM_386 307 307 308 - #define IA32_PAGE_OFFSET 0xc0000000 309 308 #define IA32_STACK_TOP IA32_PAGE_OFFSET 310 309 #define IA32_GATE_OFFSET IA32_PAGE_OFFSET 311 310 #define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE
+4 -1
arch/ia64/kernel/process.c
··· 721 721 /* drop floating-point and debug-register state if it exists: */ 722 722 current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID); 723 723 ia64_drop_fpu(current); 724 - if (IS_IA32_PROCESS(ia64_task_regs(current))) 724 + if (IS_IA32_PROCESS(ia64_task_regs(current))) { 725 725 ia32_drop_partial_page_list(current); 726 + current->thread.task_size = IA32_PAGE_OFFSET; 727 + set_fs(USER_DS); 728 + } 726 729 } 727 730 728 731 /*
+2
include/asm-ia64/ia32.h
··· 13 13 14 14 # ifdef CONFIG_IA32_SUPPORT 15 15 16 + #define IA32_PAGE_OFFSET 0xc0000000 17 + 16 18 extern void ia32_cpu_init (void); 17 19 extern void ia32_mem_init (void); 18 20 extern void ia32_gdt_init (void);