]> granicus.if.org Git - strace/commitdiff
Mpersify printsiginfo_at printer
authorElvira Khabirova <lineprinter0@gmail.com>
Mon, 3 Aug 2015 23:16:40 +0000 (02:16 +0300)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 28 Aug 2015 08:46:23 +0000 (08:46 +0000)
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.

defs.h
printsiginfo.c
process.c
signal.c
wait.c

diff --git a/defs.h b/defs.h
index 9479b9ae82d8b846eae4eb8f48db7264914d4e95..c2c44b349e82cf117321f941931f581c4c68f7dd 100644 (file)
--- 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);
index 59d92e591218b3c3d6220ccb4300bafb6f191105..fac7a44117628ad3ee615a8c3f4b429920c89282 100644 (file)
@@ -1,9 +1,15 @@
 #include "defs.h"
 
+#include DEF_MPERS_TYPE(siginfo_t)
+
 #include <signal.h>
 #include <linux/audit.h>
 
+#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;
 
index 8629184260673c2daade1d7c1aea764f715ccb25..a0144b8ff3b0361eb4d866b2c6f459873df631ef 100644 (file)
--- 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:
index 1df3fe5bed43b82e988a955e3e321e688b4898d2..978926fbdc96665a4847d746bd0d7e5bdcf2d489 100644 (file)
--- 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 2e495dbf94117a5acf861a28eecff4a5a7b8c35b..928f3dedef71caa0ffeb1852f605ed6ac8de2b9d 100644 (file)
--- 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???");