]> git.ipfire.org Git - thirdparty/shadow.git/commit
su: Fix never alarmed SIGKILL when session terminates 423/head
authorRuihan Li <lrh2000@pku.edu.cn>
Sat, 9 Oct 2021 11:54:36 +0000 (19:54 +0800)
committerlrh2000 <lrh2000@pku.edu.cn>
Mon, 25 Oct 2021 05:39:41 +0000 (13:39 +0800)
commit5b4082d00745b68dc89be0a0aadfedfc0f1660f2
treec422e8782af2f845135bc2673a44fdc77da7bcef
parentcdc8c1e25b1a7270a879b977d7f043eae0ba7416
su: Fix never alarmed SIGKILL when session terminates

The buggy code was introduced nearly 5 years ago at the
commit 08fd4b69e84364677a10e519ccb25b71710ee686. The
desired behavior is that SIGKILL will be sent to the
child if it does not exit within 2 seconds after it
receives SIGTERM. However, SIGALRM is masked while
waiting for the child so it cannot wake the program
up after 2 seconds to send SIGKILL.

An example shows the buggy behavior, which exists in
Ubuntu 18.04 LTS (with login 1:4.5-1ubuntu2).
```bash
user1@localhost:~$ su user2 -c '
_term() {
  echo SIGTERM received
}
trap _term TERM

while true; do
  sleep 1
  echo still alive
done'
Password:
still alive

Session terminated, terminating shell...Terminated
SIGTERM received
still alive
still alive
still alive
still alive
```
(SIGTERM is sent in another user1's terminal by
executing `killall su`.)

Here is the desired behavior, which shows what the
commit fixes.
```bash
user1@localhost:~$ su user2 -c '
_term() {
  echo SIGTERM received
}
trap _term TERM

while true; do
  sleep 1
  echo still alive
done'
Password:
still alive

Session terminated, terminating shell...Terminated
SIGTERM received
still alive
still alive
 ...killed.
user1@localhost:~$ echo $?
255
```
src/su.c