mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	x86/fpu: Restore the masking out of reserved MXCSR bits
Ser Olmy reported a boot failure:
  init[1] bad frame in sigreturn frame:(ptrval) ip:b7c9fbe6 sp:bf933310 orax:ffffffff \
	  in libc-2.33.so[b7bed000+156000]
  Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
  CPU: 0 PID: 1 Comm: init Tainted: G        W         5.14.9 #1
  Hardware name: Hewlett-Packard HP PC/HP Board, BIOS  JD.00.06 12/06/2001
  Call Trace:
   dump_stack_lvl
   dump_stack
   panic
   do_exit.cold
   do_group_exit
   get_signal
   arch_do_signal_or_restart
   ? force_sig_info_to_task
   ? force_sig
   exit_to_user_mode_prepare
   syscall_exit_to_user_mode
   do_int80_syscall_32
   entry_INT80_32
on an old 32-bit Intel CPU:
  vendor_id       : GenuineIntel
  cpu family      : 6
  model           : 6
  model name      : Celeron (Mendocino)
  stepping        : 5
  microcode       : 0x3
Ser bisected the problem to the commit in Fixes.
tglx suggested reverting the rejection of invalid MXCSR values which
this commit introduced and replacing it with what the old code did -
simply masking them out to zero.
Further debugging confirmed his suggestion:
  fpu->state.fxsave.mxcsr: 0xb7be13b4, mxcsr_feature_mask: 0xffbf
  WARNING: CPU: 0 PID: 1 at arch/x86/kernel/fpu/signal.c:384 __fpu_restore_sig+0x51f/0x540
so restore the original behavior only for 32-bit kernels where you have
ancient machines with buggy hardware. For 32-bit programs on 64-bit
kernels, user space which supplies wrong MXCSR values is considered
malicious so fail the sigframe restoration there.
Fixes: 6f9866a166 ("x86/fpu/signal: Let xrstor handle the features to init")
Reported-by: Ser Olmy <ser.olmy@protonmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Tested-by: Ser Olmy <ser.olmy@protonmail.com>
Cc: <stable@vger.kernel.org>
Link: https://lkml.kernel.org/r/YVtA67jImg3KlBTw@zn.tnic
			
			
This commit is contained in:
		
							parent
							
								
									225bac2dc5
								
							
						
					
					
						commit
						d298b03506
					
				
					 1 changed files with 8 additions and 3 deletions
				
			
		|  | @ -379,9 +379,14 @@ static int __fpu_restore_sig(void __user *buf, void __user *buf_fx, | ||||||
| 				     sizeof(fpu->state.fxsave))) | 				     sizeof(fpu->state.fxsave))) | ||||||
| 			return -EFAULT; | 			return -EFAULT; | ||||||
| 
 | 
 | ||||||
| 		/* Reject invalid MXCSR values. */ | 		if (IS_ENABLED(CONFIG_X86_64)) { | ||||||
| 		if (fpu->state.fxsave.mxcsr & ~mxcsr_feature_mask) | 			/* Reject invalid MXCSR values. */ | ||||||
| 			return -EINVAL; | 			if (fpu->state.fxsave.mxcsr & ~mxcsr_feature_mask) | ||||||
|  | 				return -EINVAL; | ||||||
|  | 		} else { | ||||||
|  | 			/* Mask invalid bits out for historical reasons (broken hardware). */ | ||||||
|  | 			fpu->state.fxsave.mxcsr &= ~mxcsr_feature_mask; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		/* Enforce XFEATURE_MASK_FPSSE when XSAVE is enabled */ | 		/* Enforce XFEATURE_MASK_FPSSE when XSAVE is enabled */ | ||||||
| 		if (use_xsave()) | 		if (use_xsave()) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Borislav Petkov
						Borislav Petkov