setup_environment: code shrink
run_shell: mark as NORETURN setup_environment, run_shell: add usage comments login: add FIXME :( function old new delta UNSPEC_print 64 66 +2 sulogin_main 509 506 -3 mkfs_minix_main 3070 3067 -3 login_main 1615 1612 -3 su_main 461 448 -13 setup_environment 261 206 -55 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/5 up/down: 2/-77) Total: -75 bytes text data bss dec hex filename 772578 1051 10724 784353 bf7e1 busybox_old 772502 1051 10724 784277 bf795 busybox_unstripped
This commit is contained in:
parent
ac074b3f87
commit
a2f61012b6
@ -780,6 +780,7 @@ char *bb_simplify_path(const char *path);
|
|||||||
extern void bb_do_delay(int seconds);
|
extern void bb_do_delay(int seconds);
|
||||||
extern void change_identity(const struct passwd *pw);
|
extern void change_identity(const struct passwd *pw);
|
||||||
extern const char *change_identity_e2str(const struct passwd *pw);
|
extern const char *change_identity_e2str(const struct passwd *pw);
|
||||||
|
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) ATTRIBUTE_NORETURN;
|
||||||
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args);
|
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args);
|
||||||
#if ENABLE_SELINUX
|
#if ENABLE_SELINUX
|
||||||
extern void renew_current_security_context(void);
|
extern void renew_current_security_context(void);
|
||||||
@ -790,6 +791,21 @@ extern void setfscreatecon_or_die(security_context_t scontext);
|
|||||||
#endif
|
#endif
|
||||||
extern void selinux_or_die(void);
|
extern void selinux_or_die(void);
|
||||||
extern int restricted_shell(const char *shell);
|
extern int restricted_shell(const char *shell);
|
||||||
|
|
||||||
|
/* setup_environment:
|
||||||
|
* if loginshell = 1: cd(pw->pw_dir), clear environment, then set
|
||||||
|
* TERM=(old value)
|
||||||
|
* USER=pw->pw_name, LOGNAME=pw->pw_name
|
||||||
|
* PATH=bb_default_[root_]path
|
||||||
|
* HOME=pw->pw_dir
|
||||||
|
* SHELL=shell
|
||||||
|
* else if changeenv = 1:
|
||||||
|
* if not root (if pw->pw_uid != 0):
|
||||||
|
* USER=pw->pw_name, LOGNAME=pw->pw_name
|
||||||
|
* HOME=pw->pw_dir
|
||||||
|
* SHELL=shell
|
||||||
|
* else does nothing
|
||||||
|
*/
|
||||||
extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw);
|
extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw);
|
||||||
extern int correct_password(const struct passwd *pw);
|
extern int correct_password(const struct passwd *pw);
|
||||||
/* Returns a ptr to static storage */
|
/* Returns a ptr to static storage */
|
||||||
|
@ -36,36 +36,35 @@ void setup_environment(const char *shell, int loginshell, int changeenv, const s
|
|||||||
const char *term;
|
const char *term;
|
||||||
|
|
||||||
/* Change the current working directory to be the home directory
|
/* Change the current working directory to be the home directory
|
||||||
* of the user. It is a fatal error for this process to be unable
|
* of the user */
|
||||||
* to change to that directory. There is no "default" home
|
|
||||||
* directory.
|
|
||||||
* Some systems default to HOME=/
|
|
||||||
*/
|
|
||||||
if (chdir(pw->pw_dir)) {
|
if (chdir(pw->pw_dir)) {
|
||||||
xchdir("/");
|
xchdir("/");
|
||||||
fputs("warning: cannot change to home directory\n", stderr);
|
fputs("warning: cannot change to home directory\n", stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH.
|
/* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH.
|
||||||
Unset all other environment variables. */
|
Unset all other environment variables. */
|
||||||
term = getenv("TERM");
|
term = getenv("TERM");
|
||||||
clearenv();
|
clearenv();
|
||||||
if (term)
|
if (term)
|
||||||
xsetenv("TERM", term);
|
xsetenv("TERM", term);
|
||||||
xsetenv("HOME", pw->pw_dir);
|
xsetenv("PATH", (pw->pw_uid ? bb_default_path : bb_default_root_path));
|
||||||
xsetenv("SHELL", shell);
|
goto shortcut;
|
||||||
xsetenv("USER", pw->pw_name);
|
// No, gcc (4.2.1) is not clever enougn to do it itself.
|
||||||
xsetenv("LOGNAME", pw->pw_name);
|
//xsetenv("USER", pw->pw_name);
|
||||||
xsetenv("PATH", (pw->pw_uid ? bb_default_path : bb_default_root_path));
|
//xsetenv("LOGNAME", pw->pw_name);
|
||||||
|
//xsetenv("HOME", pw->pw_dir);
|
||||||
|
//xsetenv("SHELL", shell);
|
||||||
}
|
}
|
||||||
else if (changeenv) {
|
else if (changeenv) {
|
||||||
/* Set HOME, SHELL, and if not becoming a super-user,
|
/* Set HOME, SHELL, and if not becoming a super-user,
|
||||||
USER and LOGNAME. */
|
USER and LOGNAME. */
|
||||||
xsetenv("HOME", pw->pw_dir);
|
|
||||||
xsetenv("SHELL", shell);
|
|
||||||
if (pw->pw_uid) {
|
if (pw->pw_uid) {
|
||||||
|
shortcut:
|
||||||
xsetenv("USER", pw->pw_name);
|
xsetenv("USER", pw->pw_name);
|
||||||
xsetenv("LOGNAME", pw->pw_name);
|
xsetenv("LOGNAME", pw->pw_name);
|
||||||
}
|
}
|
||||||
|
xsetenv("HOME", pw->pw_dir);
|
||||||
|
xsetenv("SHELL", shell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -432,7 +432,9 @@ int login_main(int argc, char **argv)
|
|||||||
tmp = pw->pw_shell;
|
tmp = pw->pw_shell;
|
||||||
if (!tmp || !*tmp)
|
if (!tmp || !*tmp)
|
||||||
tmp = DEFAULT_SHELL;
|
tmp = DEFAULT_SHELL;
|
||||||
|
/* setup_environment params: shell, loginshell, changeenv, pw */
|
||||||
setup_environment(tmp, 1, !(opt & LOGIN_OPT_p), pw);
|
setup_environment(tmp, 1, !(opt & LOGIN_OPT_p), pw);
|
||||||
|
/* FIXME: login shell = 1 -> 3rd parameter is ignored! */
|
||||||
|
|
||||||
motd();
|
motd();
|
||||||
|
|
||||||
@ -463,7 +465,8 @@ int login_main(int argc, char **argv)
|
|||||||
* should it leave SIGINT etc enabled or disabled? */
|
* should it leave SIGINT etc enabled or disabled? */
|
||||||
signal(SIGINT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
||||||
|
|
||||||
run_shell(tmp, 1, 0, 0); /* exec the shell finally */
|
/* Exec login shell with no additional parameters */
|
||||||
|
run_shell(tmp, 1, NULL, NULL);
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
/* return EXIT_FAILURE; - not reached */
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ int su_main(int argc, char **argv)
|
|||||||
/* get user if specified */
|
/* get user if specified */
|
||||||
if (argc) {
|
if (argc) {
|
||||||
opt_username = argv[0];
|
opt_username = argv[0];
|
||||||
// argc--;
|
//argc--; - not used below anyway
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,18 +86,19 @@ int su_main(int argc, char **argv)
|
|||||||
compromise the account by allowing access with a standard
|
compromise the account by allowing access with a standard
|
||||||
shell. */
|
shell. */
|
||||||
bb_error_msg("using restricted shell");
|
bb_error_msg("using restricted shell");
|
||||||
opt_shell = 0;
|
opt_shell = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!opt_shell)
|
if (!opt_shell)
|
||||||
opt_shell = pw->pw_shell;
|
opt_shell = pw->pw_shell;
|
||||||
|
|
||||||
change_identity(pw);
|
change_identity(pw);
|
||||||
|
/* setup_environment params: shell, loginshell, changeenv, pw */
|
||||||
setup_environment(opt_shell, flags & SU_OPT_l, !(flags & SU_OPT_mp), pw);
|
setup_environment(opt_shell, flags & SU_OPT_l, !(flags & SU_OPT_mp), pw);
|
||||||
USE_SELINUX(set_current_security_context(NULL);)
|
USE_SELINUX(set_current_security_context(NULL);)
|
||||||
|
|
||||||
/* Never returns */
|
/* Never returns */
|
||||||
run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)argv);
|
run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)argv);
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
/* return EXIT_FAILURE; - not reached */
|
||||||
}
|
}
|
||||||
|
@ -112,14 +112,15 @@ int sulogin_main(int argc, char **argv)
|
|||||||
USE_SELINUX(renew_current_security_context());
|
USE_SELINUX(renew_current_security_context());
|
||||||
|
|
||||||
shell = getenv("SUSHELL");
|
shell = getenv("SUSHELL");
|
||||||
if (!shell) shell = getenv("sushell");
|
if (!shell)
|
||||||
|
shell = getenv("sushell");
|
||||||
if (!shell) {
|
if (!shell) {
|
||||||
shell = "/bin/sh";
|
shell = "/bin/sh";
|
||||||
if (pwd->pw_shell[0])
|
if (pwd->pw_shell[0])
|
||||||
shell = pwd->pw_shell;
|
shell = pwd->pw_shell;
|
||||||
}
|
}
|
||||||
run_shell(shell, 1, 0, 0);
|
/* Exec login shell with no additional parameters. Never returns. */
|
||||||
/* never returns */
|
run_shell(shell, 1, NULL, NULL);
|
||||||
|
|
||||||
auth_error:
|
auth_error:
|
||||||
bb_error_msg_and_die("no password entry for 'root'");
|
bb_error_msg_and_die("no password entry for 'root'");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user