summaryrefslogtreecommitdiffstats
path: root/usr.bin/su
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2002-06-26 00:42:40 +0000
committerdillon <dillon@FreeBSD.org>2002-06-26 00:42:40 +0000
commitccc122e85ac8a39b837600cc0c0edd643bb3fa65 (patch)
tree6a19479c40c914ff594d669557d4b7a7cc07ed15 /usr.bin/su
parented0d76e1e45882b3f74f0a980c3771192d62a27f (diff)
downloadFreeBSD-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')
-rw-r--r--usr.bin/su/su.c11
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
OpenPOWER on IntegriCloud