• Tejun Heo's avatar
    signal: Fix SIGCONT notification code · c672af35
    Tejun Heo authored
    After a task receives SIGCONT, its parent is notified via SIGCHLD with
    its siginfo describing what the notified event is.  If SIGCONT is
    received while the child process is stopped, the code should be
    CLD_CONTINUED.  If SIGCONT is recieved while the child process is in
    the process of being stopped, it should be CLD_STOPPED.  Which code to
    use is determined in prepare_signal() and recorded in signal->flags
    using SIGNAL_CLD_CONTINUED|STOP flags.
    
    get_signal_deliver() should test these flags and then notify
    accoringly; however, it incorrectly tested SIGNAL_STOP_CONTINUED
    instead of SIGNAL_CLD_CONTINUED, thus incorrectly notifying
    CLD_CONTINUED if the signal is delivered before the task is wait(2)ed
    and CLD_STOPPED if the state was fetched already.
    
    Fix it by testing SIGNAL_CLD_CONTINUED.  While at it, uncompress the
    ?: test into if/else clause for better readability.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarRoland McGrath <roland@redhat.com>
    c672af35
signal.c 69.8 KB