From 7b5a41383b0a6534f9cccc10a716479f554bc9be Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 26 Jul 1994 03:44:37 +0000 Subject: [PATCH] . --- src/date.c | 31 +++++++++++-------------------- src/groups.sh | 2 +- src/nohup.sh | 6 +++--- src/su.c | 30 +++++++++++++++++++++++++----- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/date.c b/src/date.c index 69e8665..b100a37 100644 --- a/src/date.c +++ b/src/date.c @@ -68,7 +68,6 @@ size_t strftime (); time_t time (); #endif -int putenv (); int stime (); char *xrealloc (); @@ -79,16 +78,6 @@ void error (); static void show_date (); static void usage (); -/* putenv string to use Universal Coordinated Time. - POSIX.2 says it should be "TZ=UCT0" or "TZ=GMT0". */ -#ifndef TZ_UCT -#if defined(hpux) || defined(__hpux__) || defined(ultrix) || defined(__ultrix__) || defined(USG) -#define TZ_UCT "TZ=GMT0" -#else -#define TZ_UCT "TZ=" -#endif -#endif - /* The name this program was run with, for error messages. */ char *program_name; @@ -109,6 +98,8 @@ static struct option const long_options[] = {NULL, 0, NULL, 0} }; +static int universal_time = 0; + void main (argc, argv) int argc; @@ -118,7 +109,6 @@ main (argc, argv) char *datestr = NULL; time_t when; int set_date = 0; - int universal_time = 0; program_name = argv[0]; @@ -154,9 +144,6 @@ main (argc, argv) if (argc - optind > 1) usage (1); - if (universal_time && putenv (TZ_UCT) != 0) - error (1, 0, "virtual memory exhausted"); - time (&when); if (datestr) @@ -195,13 +182,17 @@ show_date (format, when) char *out = NULL; size_t out_length = 0; - tm = localtime (&when); + tm = (universal_time ? gmtime : localtime) (&when); if (format == NULL) - /* Print the date in the default format. Vanilla ANSI C strftime - doesn't support %e, but POSIX requires it. If you don't use - a GNU strftime, make sure yours supports %e. */ - format = "%a %b %e %H:%M:%S %Z %Y"; + { + /* Print the date in the default format. Vanilla ANSI C strftime + doesn't support %e, but POSIX requires it. If you don't use + a GNU strftime, make sure yours supports %e. */ + format = (universal_time + ? "%a %b %e %H:%M:%S GMT %Y" + : "%a %b %e %H:%M:%S %Z %Y"); + } else if (*format == '\0') { printf ("\n"); diff --git a/src/groups.sh b/src/groups.sh index bbe56aa..bcd7fd0 100755 --- a/src/groups.sh +++ b/src/groups.sh @@ -46,6 +46,6 @@ if [ $# -eq 0 ]; then id -Gn else for name in "$@"; do - echo $name : `id -Gn $name` + echo $name : `id -Gn -- $name` done fi diff --git a/src/nohup.sh b/src/nohup.sh index 3eae667..87f864d 100755 --- a/src/nohup.sh +++ b/src/nohup.sh @@ -59,14 +59,14 @@ if [ -t 1 ]; then if cat /dev/null >> nohup.out; then echo "nohup: appending output to \`nohup.out'" 2>&1 umask $oldmask - exec nice -5 "$@" >> nohup.out 2>&1 + exec nice -5 -- "$@" >> nohup.out 2>&1 else cat /dev/null >> $HOME/nohup.out echo "nohup: appending output to \`$HOME/nohup.out'" 2>&1 umask $oldmask - exec nice -5 "$@" >> $HOME/nohup.out 2>&1 + exec nice -5 -- "$@" >> $HOME/nohup.out 2>&1 fi else umask $oldmask - exec nice -5 "$@" + exec nice -5 -- "$@" fi diff --git a/src/su.c b/src/su.c index 96785fb..a5abd95 100644 --- a/src/su.c +++ b/src/su.c @@ -150,6 +150,7 @@ void setusershell (); char *basename (); char *xmalloc (); char *xrealloc (); +char *xstrdup (); void error (); static char *concat (); @@ -205,6 +206,7 @@ main (argc, argv) char **additional_args = 0; char *shell = 0; struct passwd *pw; + struct passwd pw_copy; program_name = argv[0]; fast_startup = 0; @@ -268,6 +270,16 @@ main (argc, argv) if (pw == 0) error (1, 0, "user %s does not exist", new_user); endpwent (); + + /* Make a copy of the password information and point pw at the local + copy instead. Otherwise, some systems (e.g. Linux) would clobber + the static data through the getlogin call from log_su. */ + pw_copy = *pw; + pw = &pw_copy; + pw->pw_name = xstrdup (pw->pw_name); + pw->pw_dir = xstrdup (pw->pw_dir); + pw->pw_shell = xstrdup (pw->pw_shell); + if (!correct_password (pw)) { #ifdef SYSLOG_FAILURE @@ -296,13 +308,21 @@ main (argc, argv) shell = 0; } if (shell == 0) - shell = pw->pw_shell; - shell = strcpy (xmalloc (strlen (shell) + 1), shell); + { + /* FIXME: Using malloc (through xstrdup) to allocate this space + is a minor memory leak. Consider using alloca instead. */ + shell = xstrdup (pw->pw_shell); + } modify_environment (pw, shell); change_identity (pw); if (simulate_login && chdir (pw->pw_dir)) error (0, errno, "warning: cannot change directory to %s", pw->pw_dir); + + free (pw->pw_name); + free (pw->pw_dir); + free (pw->pw_shell); + run_shell (shell, command, additional_args); } @@ -439,7 +459,7 @@ run_shell (shell, command, additional_args) if (additional_args) for (; *additional_args; ++additional_args) args[argno++] = *additional_args; - args[argno] = 0; + args[argno] = NULL; execv (shell, args); error (1, errno, "cannot run %s", shell); } @@ -463,10 +483,10 @@ log_su (pw, successful) /* The utmp entry (via getlogin) is probably the best way to identify the user, especially if someone su's from a su-shell. */ old_user = getlogin (); - if (old_user == 0) + if (old_user == NULL) old_user = ""; tty = ttyname (2); - if (tty == 0) + if (tty == NULL) tty = ""; /* 4.2BSD openlog doesn't have the third parameter. */ openlog (basename (program_name), 0 -- 2.7.4