diff options
| -rw-r--r-- | arch/x86/ia32/ia32_signal.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/signal_64.c | 11 | 
2 files changed, 7 insertions, 8 deletions
| diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 0866104f684..bbed3a26ce5 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c @@ -499,8 +499,6 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,  	regs->cs = __USER32_CS;  	regs->ss = __USER32_DS; -	set_fs(USER_DS); -  #if DEBUG_SIG  	printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",  	       current->comm, current->pid, frame, regs->ip, frame->pretcode); @@ -596,8 +594,6 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	regs->cs = __USER32_CS;  	regs->ss = __USER32_DS; -	set_fs(USER_DS); -  #if DEBUG_SIG  	printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",  	       current->comm, current->pid, frame, regs->ip, frame->pretcode); diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index 3a76702dc3f..ccb2a4560c2 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c @@ -285,10 +285,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	   even if the handler happens to be interrupting 32-bit code. */  	regs->cs = __USER_CS; -	/* This, by contrast, has nothing to do with segment registers - -	   see include/asm-x86_64/uaccess.h for details. */ -	set_fs(USER_DS); -  	return 0;  give_sigsegv: @@ -377,6 +373,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,  	if (ret == 0) {  		/* +		 * This has nothing to do with segment registers, +		 * despite the name.  This magic affects uaccess.h +		 * macros' behavior.  Reset it to the normal setting. +		 */ +		set_fs(USER_DS); + +		/*  		 * Clear the direction flag as per the ABI for function entry.  		 */  		regs->flags &= ~X86_EFLAGS_DF; | 
