mirror of
https://github.com/sudo-project/sudo.git
synced 2025-09-02 15:25:58 +00:00
Fix setting of $USER and $LOGNAME in the non-reset_env case.
Also allow HOME, SHELL, LOGNAME, and USER to be specified in keep_env
This commit is contained in:
86
env.c
86
env.c
@@ -65,6 +65,22 @@
|
|||||||
static const char rcsid[] = "$Sudo$";
|
static const char rcsid[] = "$Sudo$";
|
||||||
#endif /* lint */
|
#endif /* lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags used in env_reset()
|
||||||
|
*/
|
||||||
|
#undef DID_TERM
|
||||||
|
#define DID_TERM 0x01
|
||||||
|
#undef DID_PATH
|
||||||
|
#define DID_PATH 0x02
|
||||||
|
#undef DID_HOME
|
||||||
|
#define DID_HOME 0x04
|
||||||
|
#undef DID_SHELL
|
||||||
|
#define DID_SHELL 0x08
|
||||||
|
#undef DID_LOGNAME
|
||||||
|
#define DID_LOGNAME 0x10
|
||||||
|
#undef DID_USER
|
||||||
|
#define DID_USER 0x12
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes
|
* Prototypes
|
||||||
*/
|
*/
|
||||||
@@ -238,7 +254,7 @@ rebuild_env(sudo_mode, envp)
|
|||||||
char **envp;
|
char **envp;
|
||||||
{
|
{
|
||||||
char **newenvp, **ep, **nep, *cp, *ps1;
|
char **newenvp, **ep, **nep, *cp, *ps1;
|
||||||
int okvar, iswild, didterm, didpath;
|
int okvar, iswild, didvar;
|
||||||
size_t env_size, len;
|
size_t env_size, len;
|
||||||
struct list_member *cur;
|
struct list_member *cur;
|
||||||
|
|
||||||
@@ -250,7 +266,7 @@ rebuild_env(sudo_mode, envp)
|
|||||||
* Either clean out the environment or reset to a safe default.
|
* Either clean out the environment or reset to a safe default.
|
||||||
*/
|
*/
|
||||||
ps1 = NULL;
|
ps1 = NULL;
|
||||||
didterm = didpath = 0;
|
didvar = 0;
|
||||||
if (def_flag(I_ENV_RESET)) {
|
if (def_flag(I_ENV_RESET)) {
|
||||||
int keepit;
|
int keepit;
|
||||||
|
|
||||||
@@ -258,16 +274,6 @@ rebuild_env(sudo_mode, envp)
|
|||||||
env_size = 32 + len;
|
env_size = 32 + len;
|
||||||
nep = newenvp = (char **) emalloc(env_size * sizeof(char *));
|
nep = newenvp = (char **) emalloc(env_size * sizeof(char *));
|
||||||
|
|
||||||
*nep++ = format_env("HOME", user_dir);
|
|
||||||
*nep++ = format_env("SHELL", user_shell);
|
|
||||||
if (def_flag(I_SET_LOGNAME) && runas_pw->pw_name) {
|
|
||||||
*nep++ = format_env("LOGNAME", runas_pw->pw_name);
|
|
||||||
*nep++ = format_env("USER", runas_pw->pw_name);
|
|
||||||
} else {
|
|
||||||
*nep++ = format_env("LOGNAME", user_name);
|
|
||||||
*nep++ = format_env("USER", user_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pull in vars we want to keep from the old environment. */
|
/* Pull in vars we want to keep from the old environment. */
|
||||||
for (ep = envp; *ep; ep++) {
|
for (ep = envp; *ep; ep++) {
|
||||||
keepit = 0;
|
keepit = 0;
|
||||||
@@ -294,18 +300,49 @@ rebuild_env(sudo_mode, envp)
|
|||||||
|
|
||||||
if (keepit) {
|
if (keepit) {
|
||||||
/* Preserve variable. */
|
/* Preserve variable. */
|
||||||
|
switch (**ep) {
|
||||||
|
case 'H':
|
||||||
|
if (strncmp(*ep, "HOME=", 5) == 0)
|
||||||
|
didvar |= DID_HOME;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
if (strncmp(*ep, "SHELL=", 6) == 0)
|
||||||
|
didvar |= DID_SHELL;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
if (strncmp(*ep, "LOGNAME=", 8) == 0)
|
||||||
|
didvar |= DID_LOGNAME;
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
if (strncmp(*ep, "USER=", 5) == 0)
|
||||||
|
didvar |= DID_USER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
*nep++ = *ep;
|
*nep++ = *ep;
|
||||||
} else {
|
} else {
|
||||||
/* Preserve PATH and TERM, ignore anything else */
|
/* Preserve TERM and PATH, ignore anything else. */
|
||||||
if (!didpath && strncmp(*ep, "PATH=", 5) == 0) {
|
if (!(didvar & DID_TERM) && !strncmp(*ep, "TERM=", 5)) {
|
||||||
*nep++ = *ep;
|
*nep++ = *ep;
|
||||||
didpath = 1;
|
didvar |= DID_TERM;
|
||||||
} else if (!didterm && strncmp(*ep, "TERM=", 5) == 0) {
|
} else if (!(didvar & DID_PATH) && !strncmp(*ep, "PATH=", 5)) {
|
||||||
*nep++ = *ep;
|
*nep++ = *ep;
|
||||||
didterm = 1;
|
didvar |= DID_PATH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add in defaults unless they were preserved from the
|
||||||
|
* user's environment.
|
||||||
|
*/
|
||||||
|
if (!(didvar & DID_HOME))
|
||||||
|
*nep++ = format_env("HOME", user_dir);
|
||||||
|
if (!(didvar & DID_SHELL))
|
||||||
|
*nep++ = format_env("SHELL", user_shell);
|
||||||
|
if (!(didvar & DID_LOGNAME))
|
||||||
|
*nep++ = format_env("LOGNAME", user_name);
|
||||||
|
if (!(didvar & DID_USER))
|
||||||
|
*nep++ = format_env("USER", user_name);
|
||||||
} else {
|
} else {
|
||||||
/* Alloc space for new environment. */
|
/* Alloc space for new environment. */
|
||||||
for (env_size = 16 + len, ep = envp; *ep; ep++, env_size++)
|
for (env_size = 16 + len, ep = envp; *ep; ep++, env_size++)
|
||||||
@@ -354,16 +391,17 @@ rebuild_env(sudo_mode, envp)
|
|||||||
if (strncmp(*ep, "SUDO_PS1=", 9) == 0)
|
if (strncmp(*ep, "SUDO_PS1=", 9) == 0)
|
||||||
ps1 = *ep + 5;
|
ps1 = *ep + 5;
|
||||||
else if (strncmp(*ep, "PATH=", 5) == 0)
|
else if (strncmp(*ep, "PATH=", 5) == 0)
|
||||||
didpath = 1;
|
didvar |= DID_PATH;
|
||||||
else if (strncmp(*ep, "TERM=", 5) == 0)
|
else if (strncmp(*ep, "TERM=", 5) == 0)
|
||||||
didterm = 1;
|
didvar |= DID_TERM;
|
||||||
*nep++ = *ep;
|
*nep++ = *ep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!didterm)
|
/* Provide default values for $TERM and $PATH if they are not set. */
|
||||||
|
if (!(didvar & DID_TERM))
|
||||||
*nep++ = "TERM=unknown";
|
*nep++ = "TERM=unknown";
|
||||||
if (!didpath)
|
if (!(didvar & DID_PATH))
|
||||||
*nep++ = format_env("PATH", _PATH_DEFPATH);
|
*nep++ = format_env("PATH", _PATH_DEFPATH);
|
||||||
*nep = NULL;
|
*nep = NULL;
|
||||||
|
|
||||||
@@ -377,6 +415,12 @@ rebuild_env(sudo_mode, envp)
|
|||||||
insert_env(newenvp, format_env("PATH", SECURE_PATH));
|
insert_env(newenvp, format_env("PATH", SECURE_PATH));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Set $USER and $LOGNAME to target if "set_logname" is true. */
|
||||||
|
if (def_flag(I_SET_LOGNAME) && runas_pw->pw_name) {
|
||||||
|
insert_env(newenvp, format_env("LOGNAME", runas_pw->pw_name));
|
||||||
|
insert_env(newenvp, format_env("USER", runas_pw->pw_name));
|
||||||
|
}
|
||||||
|
|
||||||
/* Set $HOME for `sudo -H'. Only valid at PERM_RUNAS. */
|
/* Set $HOME for `sudo -H'. Only valid at PERM_RUNAS. */
|
||||||
if ((sudo_mode & MODE_RESET_HOME) && runas_pw->pw_dir)
|
if ((sudo_mode & MODE_RESET_HOME) && runas_pw->pw_dir)
|
||||||
insert_env(newenvp, format_env("HOME", runas_pw->pw_dir));
|
insert_env(newenvp, format_env("HOME", runas_pw->pw_dir));
|
||||||
|
Reference in New Issue
Block a user