diff options
author | dillon <dillon@FreeBSD.org> | 2002-06-26 00:42:40 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2002-06-26 00:42:40 +0000 |
commit | ccc122e85ac8a39b837600cc0c0edd643bb3fa65 (patch) | |
tree | 6a19479c40c914ff594d669557d4b7a7cc07ed15 /usr.bin/su/su.c | |
parent | ed0d76e1e45882b3f74f0a980c3771192d62a27f (diff) | |
download | FreeBSD-src-ccc122e85ac8a39b837600cc0c0edd643bb3fa65.zip FreeBSD-src-ccc122e85ac8a39b837600cc0c0edd643bb3fa65.tar.gz |
This is Alexander Kabaev's patch to solve the signal problem with su
(see 'zsh exits upon ^C' thread). This may be temporary be he's been
running it for a year without incident so we should be golden with it.
Approved by: des
Diffstat (limited to 'usr.bin/su/su.c')
-rw-r--r-- | usr.bin/su/su.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/usr.bin/su/su.c b/usr.bin/su/su.c index ec11570..6348099 100644 --- a/usr.bin/su/su.c +++ b/usr.bin/su/su.c @@ -132,6 +132,8 @@ main(int argc, char *argv[]) char *username, *cleanenv, *class, shellbuf[MAXPATHLEN]; const char *p, *user, *shell, *mytty, **nargv; + struct sigaction sa, sa_int, sa_quit, sa_tstp; + shell = class = cleanenv = NULL; asme = asthem = fastlogin = statusp = 0; user = "root"; @@ -314,6 +316,12 @@ main(int argc, char *argv[]) * We must fork() before setuid() because we need to call * pam_setcred(pamh, PAM_DELETE_CRED) as root. */ + sa.sa_flags = SA_RESTART; + sa.__sigaction_u.__sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sigaction(SIGINT, &sa, &sa_int); + sigaction(SIGQUIT, &sa, &sa_quit); + sigaction(SIGTSTP, &sa, &sa_tstp); statusp = 1; child_pid = fork(); @@ -339,6 +347,9 @@ main(int argc, char *argv[]) PAM_END(); exit(1); case 0: + sigaction(SIGINT, &sa_int, NULL); + sigaction(SIGQUIT, &sa_quit, NULL); + sigaction(SIGTSTP, &sa_tstp, NULL); /* * Set all user context except for: Environmental variables * Umask Login records (wtmp, etc) Path |