forked from mirrors/linux
		
	x86: hook up execveat system call
Hook up x86-64, i386 and x32 ABIs. Signed-off-by: David Drysdale <drysdale@google.com> Cc: Meredydd Luff <meredydd@senatehouse.org> Cc: Shuah Khan <shuah.kh@samsung.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Rich Felker <dalias@aerifal.cx> Cc: Christoph Hellwig <hch@infradead.org> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									51f39a1f0c
								
							
						
					
					
						commit
						27d6ec7ad6
					
				
					 7 changed files with 35 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -35,6 +35,7 @@ int ia32_classify_syscall(unsigned syscall)
 | 
			
		|||
	case __NR_socketcall:
 | 
			
		||||
		return 4;
 | 
			
		||||
	case __NR_execve:
 | 
			
		||||
	case __NR_execveat:
 | 
			
		||||
		return 5;
 | 
			
		||||
	default:
 | 
			
		||||
		return 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -480,6 +480,7 @@ GLOBAL(\label)
 | 
			
		|||
	PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
 | 
			
		||||
	PTREGSCALL stub32_sigreturn, sys32_sigreturn
 | 
			
		||||
	PTREGSCALL stub32_execve, compat_sys_execve
 | 
			
		||||
	PTREGSCALL stub32_execveat, compat_sys_execveat
 | 
			
		||||
	PTREGSCALL stub32_fork, sys_fork
 | 
			
		||||
	PTREGSCALL stub32_vfork, sys_vfork
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,7 @@ int audit_classify_syscall(int abi, unsigned syscall)
 | 
			
		|||
	case __NR_openat:
 | 
			
		||||
		return 3;
 | 
			
		||||
	case __NR_execve:
 | 
			
		||||
	case __NR_execveat:
 | 
			
		||||
		return 5;
 | 
			
		||||
	default:
 | 
			
		||||
		return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -652,6 +652,20 @@ ENTRY(stub_execve)
 | 
			
		|||
	CFI_ENDPROC
 | 
			
		||||
END(stub_execve)
 | 
			
		||||
 | 
			
		||||
ENTRY(stub_execveat)
 | 
			
		||||
	CFI_STARTPROC
 | 
			
		||||
	addq $8, %rsp
 | 
			
		||||
	PARTIAL_FRAME 0
 | 
			
		||||
	SAVE_REST
 | 
			
		||||
	FIXUP_TOP_OF_STACK %r11
 | 
			
		||||
	call sys_execveat
 | 
			
		||||
	RESTORE_TOP_OF_STACK %r11
 | 
			
		||||
	movq %rax,RAX(%rsp)
 | 
			
		||||
	RESTORE_REST
 | 
			
		||||
	jmp int_ret_from_sys_call
 | 
			
		||||
	CFI_ENDPROC
 | 
			
		||||
END(stub_execveat)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * sigreturn is special because it needs to restore all registers on return.
 | 
			
		||||
 * This cannot be done with SYSRET, so use the IRET return path instead.
 | 
			
		||||
| 
						 | 
				
			
			@ -697,6 +711,20 @@ ENTRY(stub_x32_execve)
 | 
			
		|||
	CFI_ENDPROC
 | 
			
		||||
END(stub_x32_execve)
 | 
			
		||||
 | 
			
		||||
ENTRY(stub_x32_execveat)
 | 
			
		||||
	CFI_STARTPROC
 | 
			
		||||
	addq $8, %rsp
 | 
			
		||||
	PARTIAL_FRAME 0
 | 
			
		||||
	SAVE_REST
 | 
			
		||||
	FIXUP_TOP_OF_STACK %r11
 | 
			
		||||
	call compat_sys_execveat
 | 
			
		||||
	RESTORE_TOP_OF_STACK %r11
 | 
			
		||||
	movq %rax,RAX(%rsp)
 | 
			
		||||
	RESTORE_REST
 | 
			
		||||
	jmp int_ret_from_sys_call
 | 
			
		||||
	CFI_ENDPROC
 | 
			
		||||
END(stub_x32_execveat)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -364,3 +364,4 @@
 | 
			
		|||
355	i386	getrandom		sys_getrandom
 | 
			
		||||
356	i386	memfd_create		sys_memfd_create
 | 
			
		||||
357	i386	bpf			sys_bpf
 | 
			
		||||
358	i386	execveat		sys_execveat			stub32_execveat
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -328,6 +328,7 @@
 | 
			
		|||
319	common	memfd_create		sys_memfd_create
 | 
			
		||||
320	common	kexec_file_load		sys_kexec_file_load
 | 
			
		||||
321	common	bpf			sys_bpf
 | 
			
		||||
322	64	execveat		stub_execveat
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# x32-specific system call numbers start at 512 to avoid cache impact
 | 
			
		||||
| 
						 | 
				
			
			@ -366,3 +367,4 @@
 | 
			
		|||
542	x32	getsockopt		compat_sys_getsockopt
 | 
			
		||||
543	x32	io_setup		compat_sys_io_setup
 | 
			
		||||
544	x32	io_submit		compat_sys_io_submit
 | 
			
		||||
545	x32	execveat		stub_x32_execveat
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,7 @@
 | 
			
		|||
#define stub_fork sys_fork
 | 
			
		||||
#define stub_vfork sys_vfork
 | 
			
		||||
#define stub_execve sys_execve
 | 
			
		||||
#define stub_execveat sys_execveat
 | 
			
		||||
#define stub_rt_sigreturn sys_rt_sigreturn
 | 
			
		||||
 | 
			
		||||
#define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue