]> granicus.if.org Git - strace/commitdiff
* signal (sys_rt_sigtimedwait): Fix sigtimedwait syscall decoding.
authorDenys Vlasenko <dvlasenk@redhat.com>
Wed, 15 Apr 2009 13:31:59 +0000 (13:31 +0000)
committerDenys Vlasenko <dvlasenk@redhat.com>
Wed, 15 Apr 2009 13:31:59 +0000 (13:31 +0000)
ChangeLog
signal.c

index 901331daee490bbf1e74f0c68258c79f339ad79b..6ae08a349f286774c353be4acd49fd7fe2d8d97c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2009-04-15  Denys Vlasenko  <dvlasenk@redhat.com>
+
+       * signal (sys_rt_sigtimedwait): Fix sigtimedwait syscall decoding.
+
 2009-04-15  Denys Vlasenko  <dvlasenk@redhat.com>
 
        * signal (sys_rt_sigaction): Print struct sigaction correctly
index e2a4af6f703d2c8fd7d3d906461b6a4f9a01c95c..403fe3b51b40d2107a458dca6d724eb0afacdac1 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -2034,21 +2034,32 @@ int sys_rt_sigtimedwait(struct tcb *tcp)
                else
                        printsigmask(&sigset, 1);
                tprintf(", ");
+               /* This is the only "return" parameter, */
+               if (tcp->u_arg[1] != 0)
+                       return 0;
+               /* ... if it's NULL, can decode all on entry */
+               tprintf("NULL, ");
        }
-       else {
+       else if (tcp->u_arg[1] != 0) {
+               /* syscall exit, and u_arg[1] wasn't NULL */
                if (syserror(tcp))
-                       tprintf("%#lx", tcp->u_arg[0]);
+                       tprintf("%#lx, ", tcp->u_arg[1]);
                else {
                        siginfo_t si;
                        if (umove(tcp, tcp->u_arg[1], &si) < 0)
-                               tprintf("%#lx", tcp->u_arg[1]);
-                       else
+                               tprintf("%#lx", tcp->u_arg[1]);
+                       else {
                                printsiginfo(&si, verbose(tcp));
-                       /* XXX For now */
-                       tprintf(", %#lx", tcp->u_arg[2]);
-                       tprintf(", %d", (int) tcp->u_arg[3]);
+                               tprintf(", ");
+                       }
                }
        }
+       else {
+               /* syscall exit, and u_arg[1] was NULL */
+               return 0;
+       }
+       print_timespec(tcp, tcp->u_arg[2]);
+       tprintf(", %d", (int) tcp->u_arg[3]);
        return 0;
 };