diff options
author | Karel Zak | 2012-10-02 10:14:05 +0200 |
---|---|---|
committer | Karel Zak | 2012-10-02 10:14:05 +0200 |
commit | 705ee62ff03a083ea7c06159420b7a71b0b20902 (patch) | |
tree | b3ac1bc99ace5c14c3dca6d52dafaa7a74632751 /login-utils/su-common.c | |
parent | ipcrm: avoid 'uninitialized' warning (diff) | |
download | kernel-qcow2-util-linux-705ee62ff03a083ea7c06159420b7a71b0b20902.tar.gz kernel-qcow2-util-linux-705ee62ff03a083ea7c06159420b7a71b0b20902.tar.xz kernel-qcow2-util-linux-705ee62ff03a083ea7c06159420b7a71b0b20902.zip |
su: don't modify PATH if -l not specified
This patch reverts a6fdd3f8125be23930d955c2bc6b7a46cdaf8a12.
su(1) modifies PATH if:
- option -l specified
- ALWAYS_SET_PATH login.defs variable set
Reported-by: Thomas Bächler <thomas@archlinux.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'login-utils/su-common.c')
-rw-r--r-- | login-utils/su-common.c | 126 |
1 files changed, 1 insertions, 125 deletions
diff --git a/login-utils/su-common.c b/login-utils/su-common.c index 274930313..263db700a 100644 --- a/login-utils/su-common.c +++ b/login-utils/su-common.c @@ -407,115 +407,6 @@ done: } } -/* Add or clear /sbin and /usr/sbin for the su command - used without `-'. */ - -/* Set if /sbin is found in path. */ -#define SBIN_MASK 0x01 -/* Set if /usr/sbin is found in path. */ -#define USBIN_MASK 0x02 - -static char * -addsbin (const char *const path) -{ - unsigned char smask = 0; - char *ptr, *tmp, *cur, *ret = NULL; - size_t len; - - if (!path || *path == 0) - return NULL; - - tmp = xstrdup (path); - cur = tmp; - for (ptr = strsep (&cur, ":"); ptr != NULL; ptr = strsep (&cur, ":")) - { - if (!strcmp (ptr, "/sbin")) - smask |= SBIN_MASK; - if (!strcmp (ptr, "/usr/sbin")) - smask |= USBIN_MASK; - } - - if ((smask & (USBIN_MASK|SBIN_MASK)) == (USBIN_MASK|SBIN_MASK)) - { - free (tmp); - return NULL; - } - - len = strlen (path); - if (!(smask & USBIN_MASK)) - len += strlen ("/usr/sbin:"); - - if (!(smask & SBIN_MASK)) - len += strlen (":/sbin"); - - ret = xmalloc (len + 1); - strcpy (tmp, path); - - *ret = 0; - cur = tmp; - for (ptr = strsep (&cur, ":"); ptr; ptr = strsep (&cur, ":")) - { - if (!strcmp (ptr, ".")) - continue; - if (*ret) - strcat (ret, ":"); - if (!(smask & USBIN_MASK) && !strcmp (ptr, "/bin")) - { - strcat (ret, "/usr/sbin:"); - strcat (ret, ptr); - smask |= USBIN_MASK; - continue; - } - if (!(smask & SBIN_MASK) && !strcmp (ptr, "/usr/bin")) - { - strcat (ret, ptr); - strcat (ret, ":/sbin"); - smask |= SBIN_MASK; - continue; - } - strcat (ret, ptr); - } - free (tmp); - - if (!(smask & USBIN_MASK)) - strcat (ret, ":/usr/sbin"); - - if (!(smask & SBIN_MASK)) - strcat (ret, ":/sbin"); - - return ret; -} - -static char * -clearsbin (const char *const path) -{ - char *ptr, *tmp, *cur, *ret = NULL; - - if (!path || *path == 0) - return NULL; - - tmp = xstrdup (path); - - ret = xmalloc (strlen (path) + 1); - *ret = 0; - cur = tmp; - for (ptr = strsep (&cur, ":"); ptr; ptr = strsep (&cur, ":")) - { - if (!strcmp (ptr, "/sbin")) - continue; - if (!strcmp (ptr, "/usr/sbin")) - continue; - if (!strcmp (ptr, "/usr/local/sbin")) - continue; - if (*ret) - strcat (ret, ":"); - strcat (ret, ptr); - } - free (tmp); - - return ret; -} - static void set_path(const struct passwd* pw) { @@ -563,22 +454,7 @@ modify_environment (const struct passwd *pw, const char *shell) xsetenv ("SHELL", shell, 1); if (getlogindefs_bool ("ALWAYS_SET_PATH", 0)) set_path(pw); - else - { - char const *path = getenv ("PATH"); - char *new = NULL; - - if (pw->pw_uid) - new = clearsbin (path); - else - new = addsbin (path); - - if (new) - { - xsetenv ("PATH", new, 1); - free (new); - } - } + if (pw->pw_uid) { xsetenv ("USER", pw->pw_name, 1); |