From: Denys V. <dvl...@re...> - 2012-01-18 14:29:47
Attachments:
t.c
|
Attached testcase open-codes old sigaction syscall. (Current libc usually uses rt_sigaction). Before patch, output is: sigaction(SIGTRAP, {0x804825b, [], SA_RESTORER, 0x8048253}, NULL, 0x8048253) = 0 getpid() = 5842 kill(5842, SIGTRAP) = 0 --- {si_signo=SIGTRAP, si_code=SI_USER, si_pid=5842, si_uid=0, si_value={int=134513920, ptr=0x8048500}} (Trace/breakpoint trap) --- write(1, "Got sig:5\n", 10) = 10 sigreturn() (mask []) = 0 rt_sigprocmask(SIG_BLOCK, [TRAP], NULL, 8) = 0 getpid() = 5842 kill(5842, SIGTRAP) = 0 rt_sigprocmask(SIG_UNBLOCK, [TRAP], NULL, 8) = 0 --- {si_signo=SIGTRAP, si_code=SI_USER, si_pid=5842, si_uid=0, si_value={int=134513920, ptr=0x8048500}} (Trace/breakpoint trap) --- write(1, "Got sig:5\n", 10) = 10 sigreturn() (mask []) = 0 sigaction(SIGTRAP, {SIG_IGN, , NULL, 0x8048253) = 0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ getpid() = 5842 kill(5842, SIGTRAP) = 0 --- {si_signo=SIGTRAP, si_code=SI_USER, si_pid=5842, si_uid=0, si_value={int=134513920, ptr=0x8048500}} (Trace/breakpoint trap) --- sigaction(SIGTRAP, {0x804825b, [], SA_RESTORER, 0x8048253}, NULL, 0x8048253) = 0 getpid() = 5842 kill(5842, SIGTRAP) = 0 --- {si_signo=SIGTRAP, si_code=SI_USER, si_pid=5842, si_uid=0, si_value={int=134513920, ptr=0x8048500}} (Trace/breakpoint trap) --- write(1, "Got sig:5\n", 10) = 10 sigreturn() (mask []) = 0 _exit(0) = ? +++ exited with 0 +++ Note messed-up line. Patch makes it display as: sigaction(SIGTRAP, {SIG_IGN, [], SA_RESTORER, 0x8048253}, NULL, 0x8048253) = 0 * signal (sys_sigaction): Fix display of sigaction with SIG_DFL/SIG_IGN handlers. -- vda diff -d -urpN strace.6/signal.c strace.7/signal.c --- strace.6/signal.c 2012-01-18 13:47:01.883493605 +0100 +++ strace.7/signal.c 2012-01-18 15:19:26.334601560 +0100 @@ -1022,20 +1022,20 @@ sys_sigaction(struct tcb *tcp) } #endif /* !USE_PROCFS */ tprintf("{%#lx, ", (long) sa.SA_HANDLER); + } #ifndef LINUX - printsigmask(&sa.sa_mask, 0); + printsigmask(&sa.sa_mask, 0); #else - long_to_sigset(sa.sa_mask, &sigset); - printsigmask(&sigset, 0); + long_to_sigset(sa.sa_mask, &sigset); + printsigmask(&sigset, 0); #endif - tprints(", "); - printflags(sigact_flags, sa.sa_flags, "SA_???"); + tprints(", "); + printflags(sigact_flags, sa.sa_flags, "SA_???"); #ifdef SA_RESTORER - if (sa.sa_flags & SA_RESTORER) - tprintf(", %p", sa.sa_restorer); + if (sa.sa_flags & SA_RESTORER) + tprintf(", %p", sa.sa_restorer); #endif - tprints("}"); - } + tprints("}"); } if (entering(tcp)) tprints(", "); |