From: Elvira Khabirova Date: Mon, 3 Aug 2015 23:16:40 +0000 (+0300) Subject: Mpersify printsiginfo_at printer X-Git-Tag: v4.11~238 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0b62498fd9a1fb05018e102b08c72eb510fdc4c;p=strace Mpersify printsiginfo_at printer Fix multiple personalities support in parsers of ptrace, rt_sigqueueinfo, rt_tgsigqueueinfo, rt_sigtimedwait and waitid syscalls by converting printsiginfo_at into a mpersified printer. * printsiginfo.c (siginfo_t): Mpersify. (printsiginfo_at): Wrap function name into MPERS_PRINTER_DECL. * defs.h (printsiginfo_at): Remove. * signal.c (print_sigqueueinfo, sys_rt_sigtimedwait): Use mpersified printsiginfo_at. * process.c (sys_ptrace): Likewise. * wait.c (sys_waitid): Likewise. --- diff --git a/defs.h b/defs.h index 9479b9ae..c2c44b34 100644 --- a/defs.h +++ b/defs.h @@ -630,7 +630,6 @@ extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special); extern void print_timespec(struct tcb *, long); extern void sprint_timespec(char *, struct tcb *, long); extern void printsigevent(struct tcb *tcp, long arg); -extern void printsiginfo_at(struct tcb *tcp, long addr); extern void printfd(struct tcb *, int); extern bool print_sockaddr_by_inode(const unsigned long, const char *); extern void print_dirfd(struct tcb *, int); diff --git a/printsiginfo.c b/printsiginfo.c index 59d92e59..fac7a441 100644 --- a/printsiginfo.c +++ b/printsiginfo.c @@ -1,9 +1,15 @@ #include "defs.h" +#include DEF_MPERS_TYPE(siginfo_t) + #include #include +#include MPERS_DEFS + +#ifndef IN_MPERS #include "printsiginfo.h" +#endif #include "xlat/audit_arch.h" #include "xlat/sigbus_codes.h" @@ -171,6 +177,9 @@ print_si_info(const siginfo_t *sip, bool verbose) } } +#ifdef IN_MPERS +static +#endif void printsiginfo(const siginfo_t *sip, bool verbose) { @@ -192,8 +201,7 @@ printsiginfo(const siginfo_t *sip, bool verbose) tprints("}"); } -void -printsiginfo_at(struct tcb *tcp, long addr) +MPERS_PRINTER_DECL(void, printsiginfo_at)(struct tcb *tcp, long addr) { siginfo_t si; diff --git a/process.c b/process.c index 86291842..a0144b8f 100644 --- a/process.c +++ b/process.c @@ -105,7 +105,7 @@ SYS_FUNC(ptrace) printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???"); break; case PTRACE_SETSIGINFO: { - printsiginfo_at(tcp, tcp->u_arg[3]); + MPERS_PRINTER_NAME(printsiginfo_at)(tcp, tcp->u_arg[3]); break; } case PTRACE_SETREGSET: @@ -131,7 +131,7 @@ SYS_FUNC(ptrace) break; #endif case PTRACE_GETSIGINFO: { - printsiginfo_at(tcp, tcp->u_arg[3]); + MPERS_PRINTER_NAME(printsiginfo_at)(tcp, tcp->u_arg[3]); break; } case PTRACE_GETREGSET: diff --git a/signal.c b/signal.c index 1df3fe5b..978926fb 100644 --- a/signal.c +++ b/signal.c @@ -633,7 +633,7 @@ print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo) { printsignal(sig); tprints(", "); - printsiginfo_at(tcp, uinfo); + MPERS_PRINTER_NAME(printsiginfo_at)(tcp, uinfo); } SYS_FUNC(rt_sigqueueinfo) @@ -666,7 +666,7 @@ SYS_FUNC(rt_sigtimedwait) } else if (tcp->u_arg[1] != 0) { /* syscall exit, and u_arg[1] wasn't NULL */ - printsiginfo_at(tcp, tcp->u_arg[1]); + MPERS_PRINTER_NAME(printsiginfo_at)(tcp, tcp->u_arg[1]); tprints(", "); } else { diff --git a/wait.c b/wait.c index 2e495dbf..928f3ded 100644 --- a/wait.c +++ b/wait.c @@ -149,7 +149,7 @@ SYS_FUNC(waitid) tprintf(", %ld, ", tcp->u_arg[1]); } else { /* siginfo */ - printsiginfo_at(tcp, tcp->u_arg[2]); + MPERS_PRINTER_NAME(printsiginfo_at)(tcp, tcp->u_arg[2]); /* options */ tprints(", "); printflags(wait4_options, tcp->u_arg[3], "W???");