]> granicus.if.org Git - strace/commitdiff
Fix sys_ipc/sys_semtimedop decoding on s390
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Wed, 30 Nov 2011 12:16:29 +0000 (13:16 +0100)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 1 Dec 2011 20:41:42 +0000 (20:41 +0000)
The s390 kernel sys_ipc system call only takes five arguments instead of
six arguments which the common code sys_ipc implementation takes.
One of the arguments of the sys_semtimedop subcall is therefore passed in
a different register than in the common code implementation.
This leads to broken decoding of the timespec argument:

semtimedop(0, 0x3ffffb43832, 1, {...})  = -1 EAGAIN

Fixed it looks like this:

semtimedop(0, 0x3ffffc2c842, 1, {0, 10000000}) = -1 EINTR

* linux/ipc.c (sys_semtimedop): Fix timespec decoding on s390.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
ipc.c

diff --git a/ipc.c b/ipc.c
index 25539a6d0d7bd6ca34dbf39f7f44572d725e08d1..5fb2c67ccfc3f46c6bf3d83de08ef40e1a1471a8 100644 (file)
--- a/ipc.c
+++ b/ipc.c
@@ -346,7 +346,11 @@ int sys_semtimedop(struct tcb *tcp)
                if (indirect_ipccall(tcp)) {
                        tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
                        tprints(", ");
+#if defined(S390)
+                       printtv(tcp, tcp->u_arg[2]);
+#else
                        printtv(tcp, tcp->u_arg[5]);
+#endif
                } else {
                        tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
                        tprints(", ");