diff options
author | David Drysdale <drysdale@google.com> | 2014-12-12 19:57:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-13 15:42:51 -0500 |
commit | 27d6ec7ad6f7a2a131ff8e9f77bcc6547e178d2c (patch) | |
tree | a9d56ffca09d414656cac5a57c9b55c4b226cbea /arch/x86/kernel | |
parent | 51f39a1f0cea1cacf8c787f652f26dfee9611874 (diff) |
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>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/audit_64.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 28 |
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/x86/kernel/audit_64.c b/arch/x86/kernel/audit_64.c index 06d3e5a14d9d..f3672508b249 100644 --- a/arch/x86/kernel/audit_64.c +++ b/arch/x86/kernel/audit_64.c | |||
@@ -50,6 +50,7 @@ int audit_classify_syscall(int abi, unsigned syscall) | |||
50 | case __NR_openat: | 50 | case __NR_openat: |
51 | return 3; | 51 | return 3; |
52 | case __NR_execve: | 52 | case __NR_execve: |
53 | case __NR_execveat: | ||
53 | return 5; | 54 | return 5; |
54 | default: | 55 | default: |
55 | return 0; | 56 | return 0; |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index c0226ab54106..90878aa38dbd 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -652,6 +652,20 @@ ENTRY(stub_execve) | |||
652 | CFI_ENDPROC | 652 | CFI_ENDPROC |
653 | END(stub_execve) | 653 | END(stub_execve) |
654 | 654 | ||
655 | ENTRY(stub_execveat) | ||
656 | CFI_STARTPROC | ||
657 | addq $8, %rsp | ||
658 | PARTIAL_FRAME 0 | ||
659 | SAVE_REST | ||
660 | FIXUP_TOP_OF_STACK %r11 | ||
661 | call sys_execveat | ||
662 | RESTORE_TOP_OF_STACK %r11 | ||
663 | movq %rax,RAX(%rsp) | ||
664 | RESTORE_REST | ||
665 | jmp int_ret_from_sys_call | ||
666 | CFI_ENDPROC | ||
667 | END(stub_execveat) | ||
668 | |||
655 | /* | 669 | /* |
656 | * sigreturn is special because it needs to restore all registers on return. | 670 | * sigreturn is special because it needs to restore all registers on return. |
657 | * This cannot be done with SYSRET, so use the IRET return path instead. | 671 | * This cannot be done with SYSRET, so use the IRET return path instead. |
@@ -697,6 +711,20 @@ ENTRY(stub_x32_execve) | |||
697 | CFI_ENDPROC | 711 | CFI_ENDPROC |
698 | END(stub_x32_execve) | 712 | END(stub_x32_execve) |
699 | 713 | ||
714 | ENTRY(stub_x32_execveat) | ||
715 | CFI_STARTPROC | ||
716 | addq $8, %rsp | ||
717 | PARTIAL_FRAME 0 | ||
718 | SAVE_REST | ||
719 | FIXUP_TOP_OF_STACK %r11 | ||
720 | call compat_sys_execveat | ||
721 | RESTORE_TOP_OF_STACK %r11 | ||
722 | movq %rax,RAX(%rsp) | ||
723 | RESTORE_REST | ||
724 | jmp int_ret_from_sys_call | ||
725 | CFI_ENDPROC | ||
726 | END(stub_x32_execveat) | ||
727 | |||
700 | #endif | 728 | #endif |
701 | 729 | ||
702 | /* | 730 | /* |