On Tue, May 27, 2014 at 12:52 PM, Ben Pfaff <b...@nicira.com> wrote:
> On Tue, May 27, 2014 at 12:32:50PM -0700, Ansis Atteka wrote:
>> Between fork() and execvp() calls in the process_start()
>> function both child and parent processes share the same
>> file descriptors.  This means that, if a child process
>> received a signal during this time interval, then it could
>> potentially write data to a shared file descriptor.
>>
>> One such example is fatal signal handler, where, if
>> child process received SIGTERM signal, then it would
>> write data into pipe.  Then a read event would occur
>> on the other end of the pipe where parent process is
>> listening and this would make parent process to incorrectly
>> believe that it was the one who received SIGTERM.
>> Also, since parent process never reads data from this
>> pipe, then this bug would make parent process to consume
>> 100% CPU by immediately waking up from the event loop.
>>
>> This patch will help to avoid this problem by blocking
>> signals until child closes all its file descriptors.
>>
>> Signed-off-by: Ansis Atteka <aatt...@nicira.com>
>> Reported-by: Suganya Ramachandran <sugan...@vmware.com>
>> Issue: 1255110
>
> I agree that this fixes a problem.  Thank you for tracking it down and
> coming up with a good fix.
>
> I am nervous about blocking all signals indiscriminately.  Sometimes
> libraries use signals (e.g. pthreads implementations sometimes do) and
> I don't know whether it's a good idea to block them.  PSPP used to
> have functions fatal_signal_block() and fatal_signal_unblock() to
> block the fatal signal handlers, before commit d8b30702057c
> (fatal-signal: Run signal hooks outside of actual signal handlers.).
> We could reintroduce these, or just add a function to inquire of the
> signals that fatal-signal handles (in the form of a signal mask).

I sent PATCHv2 that addresses your concern. The new patch blocks only
fatal signals.

Just curious. Do you think it would make sense to use ppoll() or
signal_fd() instead of "self pipe trick" to handle signals? Not sure
about portability, but it seems that ppoll() at least is POSIX
compliant and was introduced in Linux 2.6.16.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to