Compare commits

..

3 Commits

Author SHA1 Message Date
1035b91a3d
su: Do not change directory/set variables by default, instead add a --login option
All checks were successful
continuous-integration/drone/push Build is passing
2023-05-11 20:11:09 +02:00
a935039e78
sh: Prioritize /etc/passwd over the USER environment variable 2023-05-11 20:10:10 +02:00
18130847c1
libc: Fix some environment-related bugs 2023-05-11 20:09:46 +02:00
5 changed files with 18 additions and 12 deletions

View File

@ -38,7 +38,7 @@ Result<int> luna_main(int argc, char** argv)
username = name.view(); username = name.view();
} }
execl("/bin/su", "login", "-p", "--", username.chars(), nullptr); execl("/bin/su", "login", "-lp", "--", username.chars(), nullptr);
perror("su"); perror("su");
return 1; return 1;

View File

@ -71,12 +71,9 @@ Result<int> luna_main(int argc, char** argv)
if (getuid() == 0) prompt_end = '#'; if (getuid() == 0) prompt_end = '#';
username = getenv("USER");
if (!username)
{
struct passwd* pw = getpwuid(getuid()); struct passwd* pw = getpwuid(getuid());
if (pw) { username = pw->pw_name; } if (pw) { username = pw->pw_name; }
} else { username = getenv("USER"); }
} }
while (1) while (1)

View File

@ -55,6 +55,7 @@ Result<int> luna_main(int argc, char** argv)
{ {
StringView name; StringView name;
bool prompt_password; bool prompt_password;
bool login;
if (geteuid() != 0) if (geteuid() != 0)
{ {
@ -67,6 +68,7 @@ Result<int> luna_main(int argc, char** argv)
parser.add_system_program_info("su"_sv); parser.add_system_program_info("su"_sv);
parser.add_positional_argument(name, "name"_sv, "root"_sv); parser.add_positional_argument(name, "name"_sv, "root"_sv);
parser.add_switch_argument(prompt_password, 'p', "prompt", "prompt for a password even if running as root"); parser.add_switch_argument(prompt_password, 'p', "prompt", "prompt for a password even if running as root");
parser.add_switch_argument(login, 'l', "login"_sv, "change directory to the user's home and start a login shell");
parser.parse(argc, argv); parser.parse(argc, argv);
struct passwd* entry = getpwnam(name.chars()); struct passwd* entry = getpwnam(name.chars());
@ -93,10 +95,16 @@ Result<int> luna_main(int argc, char** argv)
setgid(entry->pw_gid); setgid(entry->pw_gid);
setuid(entry->pw_uid); setuid(entry->pw_uid);
if (login)
{
chdir(entry->pw_dir); chdir(entry->pw_dir);
clearenv();
setenv("PATH", "/bin:/sbin", 1);
}
if (login || entry->pw_uid != 0) setenv("USER", entry->pw_name, 1);
setenv("HOME", entry->pw_dir, 1); setenv("HOME", entry->pw_dir, 1);
setenv("USER", entry->pw_name, 1);
setenv("SHELL", entry->pw_shell, 1); setenv("SHELL", entry->pw_shell, 1);
execl(entry->pw_shell, entry->pw_shell, NULL); execl(entry->pw_shell, entry->pw_shell, NULL);

View File

@ -1,4 +1,3 @@
Name=login Name=login
Command=/bin/login Command=/bin/login
Restart=true Restart=true
Environment=PATH=/bin:/sbin

View File

@ -54,10 +54,10 @@ static Result<void> _try_move_env()
if (!env) if (!env)
{ {
TRY(g_dynamic_env.try_append(nullptr));
guard.deactivate(); guard.deactivate();
env_is_dynamic = true; env_is_dynamic = true;
environ = g_dynamic_env.data(); environ = g_dynamic_env.data();
check(!environ);
return {}; return {};
} }
@ -109,10 +109,12 @@ extern "C"
{ {
if (element) free(element); if (element) free(element);
} }
g_dynamic_env.clear();
} }
env_is_dynamic = false;
environ = nullptr; environ = nullptr;
env_is_dynamic = false;
return 0; return 0;
} }