[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>
This commit is contained in:
Родитель
acb7f67280
Коммит
bd1d6e2451
|
@ -261,8 +261,6 @@ elf32_set_personality (void)
|
|||
{
|
||||
set_personality(PER_LINUX32);
|
||||
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
|
||||
|
|
|
@ -305,7 +305,6 @@ struct old_linux32_dirent {
|
|||
#define ELF_DATA ELFDATA2LSB
|
||||
#define ELF_ARCH EM_386
|
||||
|
||||
#define IA32_PAGE_OFFSET 0xc0000000
|
||||
#define IA32_STACK_TOP IA32_PAGE_OFFSET
|
||||
#define IA32_GATE_OFFSET IA32_PAGE_OFFSET
|
||||
#define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE
|
||||
|
|
|
@ -721,8 +721,11 @@ flush_thread (void)
|
|||
/* drop floating-point and debug-register state if it exists: */
|
||||
current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
|
||||
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);
|
||||
current->thread.task_size = IA32_PAGE_OFFSET;
|
||||
set_fs(USER_DS);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
# ifdef CONFIG_IA32_SUPPORT
|
||||
|
||||
#define IA32_PAGE_OFFSET 0xc0000000
|
||||
|
||||
extern void ia32_cpu_init (void);
|
||||
extern void ia32_mem_init (void);
|
||||
extern void ia32_gdt_init (void);
|
||||
|
|
Загрузка…
Ссылка в новой задаче