Messages in this thread | | | Date | Thu, 28 Aug 2008 15:24:42 +0200 | From | Pierre Morel <> | Subject | Re: [RFC] [Patch 1/1] [Self Ptrace] System call notification with self_ptrace |
| |
Oleg Nesterov wrote: > On 08/28, Pierre Morel wrote: > >> Oleg Nesterov wrote: >> >>> On 08/27, Pierre Morel wrote: >>> >>> >>>> Oleg Nesterov wrote: >>>> >>>> >>>> >>>>> On s390 the patch changes handle_signal(), this is not clear to me too. >>>>> >>>>> >>>>> >>>> The patch clears the trace flags before delivering the signal so >>>> that the signal handler can use system call without bouncing again. >>>> >>>> >>> Yes I see. But the signal handler for SIGSYS can fisrt do >>> sys_ptrace(PTRACE_SELF_OFF) (which is filtered out), and then use any >>> other syscall. >>> >>> >> It is right but brings the overhead of a syscall. >> > > Well, this overhead is very small compared to the signal delivery. > May be, but very high compared to the operation to just clear a flag in the task struct. This operation must be done anyway. > >>> With this patch PT_SELF is cleared on any signal. This doesn't look >>> right. Let's suppose that another signal comes in parallel with SIGSYS. >>> It is very possible that the handler for that another signal will be >>> called first, this handler can do some syscall which will be "missed". >>> >>> >> If the tracing application catches all signals before delivering >> them to the instrumented original handler there is no problem, >> the catching code can reset PTRACE_SELF_ON before calling the >> instrumented application's original handler. >> The instrumented code will then bounce as expected. >> > > Sorry, can't understand the text above :( > > OK, let's suppose the application does > > ptrace(PTRACE_SELF_ON); > ... > syscall(); > > This "syscall()" above should trigger the handler for SIGSYS. > But what if another signal (with handler) comes in between? > In that case handle_signal() clears PT_SELF/TIF_SYSCALL_TRACE, > this syscall() (or any other) doesn't send SIGSYS. > ok, please read "set PTRACE_SELF_ON" where I wrote "reset PTRACE_SELF_ON" above.
Now, suppose the application does the following:
sigsys_handler(sig) { .... ptrace(PTRACE_SELF_ON); }
sigx_handler(sig) { .... ptrace(PTRACE_SELF_ON); if (sig_has_a_handler) call_the_handler() ptrace(PTRACE_SELF_OFF); ... ptrace(PTRACE_SELF_ON); }
main(){ ... signal(SIGSYS, sigsys_handler); for(i=0; i<MAXSIGS; i++) signal(i, sigx_handler); ptrace(PTRACE_SELF_ON); jump_into_instrumented_code; ... }
If the instrumented code ever does a call to signal(2), the call will be received by sig_sys() handler, where the call the application signal handler can be performed with PTRACE_SELF_ON. This implies appropriate instrumentation of signal(2) and sigaction(2).
Pierre
-- ============= Pierre Morel RTOS and Embedded Linux
| |