Terminate the child before closing the PAM session.

* src/su.c: Terminate the child (if needed) before closing the PAM
	session. This is probably more correct, and avoid reporting
	termination from signals possibly sent by PAM modules (e.g. former
	versions of pam_systemd). Debian#670132
This commit is contained in:
Nicolas François 2013-08-13 19:48:53 +02:00
parent a5e3dbb0e3
commit 8781aff637
2 changed files with 13 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2013-08-13 Nicolas François <nicolas.francois@centraliens.net>
* src/su.c: Terminate the child (if needed) before closing the PAM
session. This is probably more correct, and avoid reporting
termination from signals possibly sent by PAM modules (e.g. former
versions of pam_systemd). Debian#670132
2013-08-13 Nicolas François <nicolas.francois@centraliens.net> 2013-08-13 Nicolas François <nicolas.francois@centraliens.net>
* src/su.c: When a SIGTSTP is caught, reset caught to 0. There is * src/su.c: When a SIGTSTP is caught, reset caught to 0. There is

View File

@ -372,6 +372,12 @@ static void prepare_pam_close_session (void)
(void) fputs (_("Session terminated, terminating shell..."), (void) fputs (_("Session terminated, terminating shell..."),
stderr); stderr);
(void) kill (-pid_child, caught); (void) kill (-pid_child, caught);
(void) signal (SIGALRM, kill_child);
(void) alarm (2);
(void) wait (&status);
(void) fputs (_(" ...terminated.\n"), stderr);
} }
ret = pam_close_session (pamh, 0); ret = pam_close_session (pamh, 0);
@ -384,14 +390,6 @@ static void prepare_pam_close_session (void)
(void) pam_setcred (pamh, PAM_DELETE_CRED); (void) pam_setcred (pamh, PAM_DELETE_CRED);
(void) pam_end (pamh, PAM_SUCCESS); (void) pam_end (pamh, PAM_SUCCESS);
if (0 != caught) {
(void) signal (SIGALRM, kill_child);
(void) alarm (2);
(void) wait (&status);
(void) fputs (_(" ...terminated.\n"), stderr);
}
exit ((0 != WIFEXITED (status)) ? WEXITSTATUS (status) exit ((0 != WIFEXITED (status)) ? WEXITSTATUS (status)
: WTERMSIG (status) + 128); : WTERMSIG (status) + 128);
/* Only the child returns. See above. */ /* Only the child returns. See above. */