detach() logic

Denys Vlasenko dvlasenk at redhat.com
Fri Jun 21 11:47:22 UTC 2013


On 06/21/2013 02:07 AM, Dmitry V. Levin wrote:
>> However, now I see another, very simple bug in detach():
>>
>>                 sigstop_expected = (tcp->flags & TCB_IGNORE_ONE_SIGSTOP);
>>                 error = ptrace(PTRACE_DETACH, tcp->pid, 0, 0);
>>
>> What if sigstop_expected == 1 (IOW: TCB_IGNORE_ONE_SIGSTOP is set)?
>>
>> We will DETACH _before_ we eat and discard SIGSTOP.
>> After DETACH, we will do waitpid loop, see SIGSTOP,
>> and... try DETACH again! lol :(
> 
> No, in that case waitpid will fail with ECHILD, so there would be no try
> for the second PTRACE_DETACH.  With your recent commit v4.8-16-gfdfa47a,
> strace will complain:
> strace: detach: waitpid(12345): No child processes

Yes, I was wrong about how it will look to the user...

> I've actually managed to reproduce this warning with a very artificial test.
> 
>> Does it look like a real bug to you too?
> 
> It looks like a bug, SIGSTOP is certainly not expected after successful
> PTRACE_DETACH.

I contemplate the following fix:

	sigstop_expected = (tcp->flags & TCB_IGNORE_ONE_SIGSTOP);
	if (!sigstop_expected)   // <-- added this one line
		error = ptrace(PTRACE_DETACH, tcp->pid, 0, 0);

Do you see any problem with this approach?




More information about the Strace-devel mailing list