su: fix shell suspend in tcsh (#597928)

This commit is contained in:
Ondřej Vašík 2011-08-23 14:54:04 +02:00
parent 9938e5be66
commit 6ff9fce161
2 changed files with 20 additions and 7 deletions

View File

@ -106,7 +106,7 @@ index f8f5b61..811aad7 100644
static struct option const longopts[] =
{
{"command", required_argument, NULL, 'c'},
@@ -200,7 +224,164 @@ log_su (struct passwd const *pw, bool successful)
@@ -200,7 +224,174 @@ log_su (struct passwd const *pw, bool successful)
}
#endif
@ -168,7 +168,7 @@ index f8f5b61..811aad7 100644
+create_watching_parent (void)
+{
+ pid_t child;
+ sigset_t ourset;
+ sigset_t ourset, blockset;
+ int status = 0;
+
+ retval = pam_open_session (pamh, 0);
@ -230,7 +230,17 @@ index f8f5b61..811aad7 100644
+
+ if (pid != (pid_t)-1 && WIFSTOPPED (status))
+ {
+ /* tcsh sends SIGTSTP to the process group, and so is already pending */
+ kill (getpid (), SIGSTOP);
+ if (WSTOPSIG(status) != SIGSTOP) {
+ sigemptyset(&blockset);
+ if (sigaddset(&blockset, WSTOPSIG(status)) ||
+ sigprocmask(SIG_UNBLOCK, &blockset, &ourset) ||
+ sigprocmask(SIG_SETMASK, &ourset, NULL))
+ {
+ error (0, errno, _("cannot set signal handler"));
+ }
+ }
+ /* once we get here, we must have resumed */
+ kill (pid, SIGCONT);
+ }
@ -271,7 +281,7 @@ index f8f5b61..811aad7 100644
Return true if the user gives the correct password for entry PW,
false if not. Return true without asking for a password if run by UID 0
or if PW has an empty password. */
@@ -208,10 +389,52 @@ log_su (struct passwd const *pw, bool successful)
@@ -208,10 +399,52 @@ log_su (struct passwd const *pw, bool successful)
static bool
correct_password (const struct passwd *pw)
{
@ -325,7 +335,7 @@ index f8f5b61..811aad7 100644
endspent ();
if (sp)
@@ -232,6 +455,7 @@ correct_password (const struct passwd *pw)
@@ -232,6 +465,7 @@ correct_password (const struct passwd *pw)
encrypted = crypt (unencrypted, correct);
memset (unencrypted, 0, strlen (unencrypted));
return STREQ (encrypted, correct);
@ -333,7 +343,7 @@ index f8f5b61..811aad7 100644
}
/* Update `environ' for the new shell based on PW, with SHELL being
@@ -274,19 +498,41 @@ modify_environment (const struct passwd *pw, const char *shell)
@@ -274,19 +508,41 @@ modify_environment (const struct passwd *pw, const char *shell)
}
}
}
@ -377,7 +387,7 @@ index f8f5b61..811aad7 100644
if (setgid (pw->pw_gid))
error (EXIT_CANCELED, errno, _("cannot set group id"));
if (setuid (pw->pw_uid))
@@ -500,9 +746,21 @@ main (int argc, char **argv)
@@ -500,9 +756,21 @@ main (int argc, char **argv)
shell = NULL;
}
shell = xstrdup (shell ? shell : pw->pw_shell);

View File

@ -1,7 +1,7 @@
Summary: A set of basic GNU tools commonly used in shell scripts
Name: coreutils
Version: 8.12
Release: 5%{?dist}
Release: 6%{?dist}
License: GPLv3+
Group: System Environment/Base
Url: http://www.gnu.org/software/coreutils/
@ -335,6 +335,9 @@ fi
%{_libdir}/coreutils
%changelog
* Tue Aug 23 2011 Ondrej Vasik <ovasik@redhat.com> - 8.12-6
- su: fix shell suspend in tcsh (#597928)
* Thu Aug 18 2011 Ondrej Vasik <ovasik@redhat.com> - 8.12-5
- variable "u" should be static in uname processor type patch