summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2014-03-11 22:18:40 +0000
committerDmitry V. Levin <ldv@altlinux.org>2014-03-11 22:18:40 +0000
commitbc091e3ce1481615568ef6e35636fc45262250ff (patch)
treeb3edd4fc76f4f58e288c4701e6b3bfe79e23e743
parentb9d4d21a611e852e4ef6c021688e4f45f9a137ed (diff)
downloadstrace-bc091e3ce1481615568ef6e35636fc45262250ff.tar.gz
strace-bc091e3ce1481615568ef6e35636fc45262250ff.tar.bz2
strace-bc091e3ce1481615568ef6e35636fc45262250ff.tar.xz
printsiginfo: add SIGSYS decoding
* configure.ac (AC_CHECK_MEMBERS): Check for siginfo_t.si_syscall. * signal.c (SYS_SECCOMP): Define if not yet defined. (sigsys_codes): new xlat structure. (printsiginfo): Decode SIGSYS.
-rw-r--r--configure.ac3
-rw-r--r--signal.c19
2 files changed, 21 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 682f54e..39832ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -256,7 +256,8 @@ AC_CHECK_TYPES([struct user_desc],,, [#include <asm/ldt.h>])
AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include <sys/utsname.h>])
AC_CHECK_MEMBERS([struct sigevent._sigev_un._pad,
- struct sigevent.__pad],,, [#include <signal.h>])
+ struct sigevent.__pad,
+ siginfo_t.si_syscall],,, [#include <signal.h>])
AC_CHECK_TYPES([struct flock64],,, [#include <fcntl.h>])
diff --git a/signal.c b/signal.c
index c85e1b5..e3072f1 100644
--- a/signal.c
+++ b/signal.c
@@ -354,6 +354,7 @@ print_sigset_addr_len(struct tcb *tcp, long addr, long len)
#define BUS_ADRALN 1 /* invalid address alignment */
#define BUS_ADRERR 2 /* non-existant physical address */
#define BUS_OBJERR 3 /* object specific hardware error */
+#define SYS_SECCOMP 1 /* seccomp triggered */
#define TRAP_BRKPT 1 /* process breakpoint */
#define TRAP_TRACE 2 /* process trace trap */
#define CLD_EXITED 1 /* child has exited */
@@ -503,6 +504,14 @@ static const struct xlat sigbus_codes[] = {
XLAT_END
};
+#ifndef SYS_SECCOMP
+# define SYS_SECCOMP 1
+#endif
+static const struct xlat sigsys_codes[] = {
+ XLAT(SYS_SECCOMP),
+ XLAT_END
+};
+
static void
printsigsource(const siginfo_t *sip)
{
@@ -565,6 +574,9 @@ printsiginfo(siginfo_t *sip, int verbose)
case SIGBUS:
code = xlookup(sigbus_codes, sip->si_code);
break;
+ case SIGSYS:
+ code = xlookup(sigsys_codes, sip->si_code);
+ break;
}
}
if (code)
@@ -640,6 +652,13 @@ printsiginfo(siginfo_t *sip, int verbose)
break;
}
break;
+#ifdef HAVE_SIGINFO_T_SI_SYSCALL
+ case SIGSYS:
+ tprintf(", si_call_addr=%#lx, si_syscall=%d, si_arch=%u",
+ (unsigned long) sip->si_call_addr,
+ sip->si_syscall, sip->si_arch);
+ break;
+#endif
default:
if (sip->si_pid || sip->si_uid)
printsigsource(sip);