arm64: add SIGSYS siginfo for compat task
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Fri, 28 Nov 2014 05:26:38 +0000 (05:26 +0000)
committerWill Deacon <will.deacon@arm.com>
Fri, 28 Nov 2014 10:24:59 +0000 (10:24 +0000)
SIGSYS is primarily used in secure computing to notify tracer of syscall
events. This patch allows signal handler on compat task to get correct
information with SA_SIGINFO specified when this signal is delivered.

Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/compat.h
arch/arm64/kernel/signal32.c

index 56de5aadede241e0464c42ebcc00284e616d82ac..3fb053fa6e981b40accf4180187dd0789edeb1f0 100644 (file)
@@ -205,6 +205,13 @@ typedef struct compat_siginfo {
                        compat_long_t _band;    /* POLL_IN, POLL_OUT, POLL_MSG */
                        int _fd;
                } _sigpoll;
+
+               /* SIGSYS */
+               struct {
+                       compat_uptr_t _call_addr; /* calling user insn */
+                       int _syscall;   /* triggering system call number */
+                       compat_uint_t _arch;    /* AUDIT_ARCH_* of syscall */
+               } _sigsys;
        } _sifields;
 } compat_siginfo_t;
 
index 1b9ad02837cfcafd4ecbc87f3e10aafe504ac0de..5a1ba6e80d4e20b6d95b0152d99e2ebca53e7424 100644 (file)
@@ -186,6 +186,12 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
                err |= __put_user(from->si_uid, &to->si_uid);
                err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr);
                break;
+       case __SI_SYS:
+               err |= __put_user((compat_uptr_t)(unsigned long)
+                               from->si_call_addr, &to->si_call_addr);
+               err |= __put_user(from->si_syscall, &to->si_syscall);
+               err |= __put_user(from->si_arch, &to->si_arch);
+               break;
        default: /* this is just in case for now ... */
                err |= __put_user(from->si_pid, &to->si_pid);
                err |= __put_user(from->si_uid, &to->si_uid);