использование Sys :: SigAction :: timeout_call небезопасно? - PullRequest
2 голосов
/ 09 января 2012

Я только что прочитал статью Леона Тиммерманса Что вы должны знать о тайм-аутах на основе сигналов , и мне было интересно, как это / применимо ли это к использованию Sys::SigAction::timeout_call().

1) Прежде всего, кажется, что timeout_call() использует longjmp и небезопасные сигналы, и поэтому применимо правило CERT Secure Coding SIG32-C .

2) Is timeout_callБезопасно ли использовать, если код, отслеживаемый в течение тайм-аутов, содержит только чистый Perl-код (т. е. нет обращений к модулям XS)?

1 Ответ

2 голосов
/ 09 января 2012

1) timeout_call() использует почти ту же идиому, чтобы обернуть системный вызов в блок eval/alarm, как пример Леона:

my $ALARM_EXCEPTION = "alarm clock restart";
my $h;
eval {
    $h = set_sig_handler('ALRM', sub { die $ALARM_EXCEPTION }, { });
    alarm 10;
    flock $fh, 2 or die "cannot flock: $!";
    alarm 0;
};
alarm 0;
$SIG{ALRM} = $h;
if ($@ && $@ !~ quotemeta($ALARM_EXCEPTION)) { die }

Так что, если set_sig_handler отключает / переопределяет безопасную обработку сигналов,тогда timeout_call тоже будет.

2) Pure Perl по-прежнему может иметь множество взаимодействий с операционной системой, и то, как каждый системный вызов реагирует на сигналы, может сильно различаться в зависимости от платформы.Так что в общем случае ответ - нет.

...