mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-09-09 17:45:00 +03:00
pid1: restore the original environment passed by the kernel when switching to a new system manager
PID1 may modified the environment passed by the kernel when it starts
running. Commit 9d48671c62
unset $HOME for
example.
In case PID1 is going to switch to a new root and execute a new system manager
which is not systemd, we should restore the original environment as the new
manager might expect some variables to be set by default (more specifically
$HOME).
This commit is contained in:
committed by
Zbigniew Jędrzejewski-Szmek
parent
694566454a
commit
a5cede8c24
@@ -39,6 +39,7 @@
|
|||||||
#include "set.h"
|
#include "set.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "stat-util.h"
|
#include "stat-util.h"
|
||||||
|
#include "static-destruct.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "time-util.h"
|
#include "time-util.h"
|
||||||
@@ -49,8 +50,11 @@
|
|||||||
|
|
||||||
int saved_argc = 0;
|
int saved_argc = 0;
|
||||||
char **saved_argv = NULL;
|
char **saved_argv = NULL;
|
||||||
|
char **saved_env = NULL;
|
||||||
static int saved_in_initrd = -1;
|
static int saved_in_initrd = -1;
|
||||||
|
|
||||||
|
STATIC_DESTRUCTOR_REGISTER(saved_env, strv_freep);
|
||||||
|
|
||||||
bool kexec_loaded(void) {
|
bool kexec_loaded(void) {
|
||||||
_cleanup_free_ char *s = NULL;
|
_cleanup_free_ char *s = NULL;
|
||||||
|
|
||||||
@@ -298,3 +302,7 @@ void disable_coredumps(void) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_debug_errno(r, "Failed to turn off coredumps, ignoring: %m");
|
log_debug_errno(r, "Failed to turn off coredumps, ignoring: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void save_env(void) {
|
||||||
|
saved_env = strv_copy(environ);
|
||||||
|
}
|
||||||
|
@@ -13,6 +13,9 @@ static inline void save_argc_argv(int argc, char **argv) {
|
|||||||
saved_argv = argv;
|
saved_argv = argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern char **saved_env;
|
||||||
|
void save_env(void);
|
||||||
|
|
||||||
bool kexec_loaded(void);
|
bool kexec_loaded(void);
|
||||||
|
|
||||||
int prot_from_flags(int flags) _const_;
|
int prot_from_flags(int flags) _const_;
|
||||||
|
@@ -1648,7 +1648,7 @@ static void do_reexecute(
|
|||||||
|
|
||||||
if (switch_root_init) {
|
if (switch_root_init) {
|
||||||
args[0] = switch_root_init;
|
args[0] = switch_root_init;
|
||||||
(void) execv(args[0], (char* const*) args);
|
(void) execve(args[0], (char* const*) args, saved_env);
|
||||||
log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
|
log_warning_errno(errno, "Failed to execute configured init, trying fallback: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1665,7 +1665,7 @@ static void do_reexecute(
|
|||||||
|
|
||||||
args[0] = "/bin/sh";
|
args[0] = "/bin/sh";
|
||||||
args[1] = NULL;
|
args[1] = NULL;
|
||||||
(void) execv(args[0], (char* const*) args);
|
(void) execve(args[0], (char* const*) args, saved_env);
|
||||||
log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
|
log_error_errno(errno, "Failed to execute /bin/sh, giving up: %m");
|
||||||
} else
|
} else
|
||||||
log_warning_errno(r, "Failed to execute /sbin/init, giving up: %m");
|
log_warning_errno(r, "Failed to execute /sbin/init, giving up: %m");
|
||||||
@@ -2392,6 +2392,10 @@ int main(int argc, char *argv[]) {
|
|||||||
/* Save the original command line */
|
/* Save the original command line */
|
||||||
save_argc_argv(argc, argv);
|
save_argc_argv(argc, argv);
|
||||||
|
|
||||||
|
/* Save the original environment as we might need to restore it if we're requested to
|
||||||
|
* execute another system manager later. */
|
||||||
|
save_env();
|
||||||
|
|
||||||
/* Make sure that if the user says "syslog" we actually log to the journal. */
|
/* Make sure that if the user says "syslog" we actually log to the journal. */
|
||||||
log_set_upgrade_syslog_to_journal(true);
|
log_set_upgrade_syslog_to_journal(true);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user