klenin / Spawner

Cross-platform sandbox runner
4 stars 8 forks source link

posix/runner.cpp: Fix race between calls 'resume' and 'suspend' #104

Closed try1117 closed 6 years ago

try1117 commented 6 years ago

Рассмотрим функции suspend, resume класса runner. Обе функции посылают сигналы "SIGSTOP" и "SIGCONT", если "process_status" равен "process_still_active" и "process_suspended" соответственно. До того как сигнал будет обработан и состояние process_status изменится на новое, может произойти несколько вызовов suspend/resume. Для запоминания этого используется переменная "resume_requested". Если после вызова "suspend" произошел вызов "resume", то после срабатывания обработчика "suspend" выполнится if (resume_requested) { resume(); } Если после вызова "resume" происходит вызов "suspend", необходимо обнулять переменную "resume_requested".

Смену состояния "process_status = process_suspended;" в методе runner::waitpid_body, необходимо делать до вызова функции resume(), так как в ней происходит проверка if (get_process_status() == process_suspended) kill(proc_pid, SIGCONT);