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();
}
execl("/bin/su", "login", "-p", "--", username.chars(), nullptr);
execl("/bin/su", "login", "-lp", "--", username.chars(), nullptr);
perror("su");
return 1;

View File

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

View File

@ -55,6 +55,7 @@ Result<int> luna_main(int argc, char** argv)
{
StringView name;
bool prompt_password;
bool login;
if (geteuid() != 0)
{
@ -67,6 +68,7 @@ Result<int> luna_main(int argc, char** argv)
parser.add_system_program_info("su"_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(login, 'l', "login"_sv, "change directory to the user's home and start a login shell");
parser.parse(argc, argv);
struct passwd* entry = getpwnam(name.chars());
@ -93,10 +95,16 @@ Result<int> luna_main(int argc, char** argv)
setgid(entry->pw_gid);
setuid(entry->pw_uid);
chdir(entry->pw_dir);
if (login)
{
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("USER", entry->pw_name, 1);
setenv("SHELL", entry->pw_shell, 1);
execl(entry->pw_shell, entry->pw_shell, NULL);

View File

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

View File

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