Race condition in tdb_runtime_check_for_robust_mutexes()

Uri Simchoni uri at samba.org
Wed Mar 23 08:56:06 UTC 2016


On 03/23/2016 10:30 AM, Ralph Boehme wrote:
> On Wed, Mar 23, 2016 at 07:36:53AM +0200, Uri Simchoni wrote:
>> OK I've figured out why we want the waitpid() in the signal handler - we
>> want to catch the child terminating yet still support SIGCHLD handling of
>> the enclosing process.
>>
>> Hopefully I'll submit a patch shortly.
>
> I just briefly looked over this, so I might be missing something, but
> afaict we could block SIGCHLD, getting rid of our own signal handler
> and thus getting rid of the race between two calls to waitpid().
>
> -Ralph
>
We have to make sure SIGCHLD is not set to SIG_IGN or we won't be able 
to waitpid().

An alternative approach to today's signal handler might be:
1. block SIGCHLD
2. set SIGCHLD handler to SIG_DFL - this makes sure it's not SIG_IGN
3. fork, do handshake, waitpid()
4. restore signal handler
5. restore signal mask

It's certainly less code, given that a fix that maintains the current 
signal handler also has to temporarily block SIGCHLD in order to avoid 
the race.

Perhaps the intent of the existing signal handler is to leave absolutely 
no trace of this child process - if there is a pre-installed signal 
handler, after we unblock SIGCHLD it will see something that looks like 
a spurious SIGCHLD.

Currently I'm testing a fix that leaves the signal handler as-is and 
hopefully fixes the issue.

Thanks,
Uri.



More information about the samba-technical mailing list