summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
authorFranck Bui <fbui@suse.com>2019-10-01 14:31:14 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-10-03 22:08:13 +0200
commita5cede8c24fddda9b73f142e09b18b49adde1b9c (patch)
tree3f34650eb418af0322d2591f40ee545e4ff41d54 /src/basic
parent694566454a42c08e791b3b8118351bdb6c0b96d2 (diff)
downloadsystemd-a5cede8c24fddda9b73f142e09b18b49adde1b9c.tar.gz
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 9d48671c62de133a2b9fe7c31e70c0ff8e68f2db 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).
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/util.c8
-rw-r--r--src/basic/util.h3
2 files changed, 11 insertions, 0 deletions
diff --git a/src/basic/util.c b/src/basic/util.c
index 93d610bc98..4989b8aa77 100644
--- a/src/basic/util.c
+++ b/src/basic/util.c
@@ -39,6 +39,7 @@
#include "set.h"
#include "signal-util.h"
#include "stat-util.h"
+#include "static-destruct.h"
#include "string-util.h"
#include "strv.h"
#include "time-util.h"
@@ -49,8 +50,11 @@
int saved_argc = 0;
char **saved_argv = NULL;
+char **saved_env = NULL;
static int saved_in_initrd = -1;
+STATIC_DESTRUCTOR_REGISTER(saved_env, strv_freep);
+
bool kexec_loaded(void) {
_cleanup_free_ char *s = NULL;
@@ -298,3 +302,7 @@ void disable_coredumps(void) {
if (r < 0)
log_debug_errno(r, "Failed to turn off coredumps, ignoring: %m");
}
+
+void save_env(void) {
+ saved_env = strv_copy(environ);
+}
diff --git a/src/basic/util.h b/src/basic/util.h
index 6fc7480fcb..15444b2e5c 100644
--- a/src/basic/util.h
+++ b/src/basic/util.h
@@ -13,6 +13,9 @@ static inline void save_argc_argv(int argc, char **argv) {
saved_argv = argv;
}
+extern char **saved_env;
+void save_env(void);
+
bool kexec_loaded(void);
int prot_from_flags(int flags) _const_;