summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2019-11-01 11:26:05 +0100
committerLennart Poettering <lennart@poettering.net>2019-11-01 11:30:59 +0100
commit0e06a03165bdec49c79d12043e690d8f3a672812 (patch)
tree023e6b804fc3d4ac9e1820b736bd937c9f7a2a1b /src
parent6878c02245b49987749e73a12003fcf07bf173ca (diff)
downloadsystemd-0e06a03165bdec49c79d12043e690d8f3a672812.tar.gz
pid1: rework environment block copy logic
This reworks the logic introduced in a5cede8c24fddda9b73f142e09b18b49adde1b9c (#13693). First of all, let's move this out of util.c, since only PID 1 really needs this, and there's no real need to have it in util.c. Then, fix freeing of the variable. It previously relied on STATIC_DESTRUCTOR_REGISTER() which however relies on static_destruct() to be called explicitly. Currently only the main-func.h macros do that, and PID 1 does not. (It might be worth investigating whether to do that, but it's not trivial.) Hence the freeing wasn't applied. Finally, an OOM check was missing, add it in.
Diffstat (limited to 'src')
-rw-r--r--src/basic/util.c8
-rw-r--r--src/basic/util.h3
-rw-r--r--src/core/main.c26
3 files changed, 23 insertions, 14 deletions
diff --git a/src/basic/util.c b/src/basic/util.c
index b02471c483..f74ed95a60 100644
--- a/src/basic/util.c
+++ b/src/basic/util.c
@@ -38,7 +38,6 @@
#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,11 +48,8 @@
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;
@@ -301,7 +297,3 @@ 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 15444b2e5c..6fc7480fcb 100644
--- a/src/basic/util.h
+++ b/src/basic/util.h
@@ -13,9 +13,6 @@ 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_;
diff --git a/src/core/main.c b/src/core/main.c
index 7c814f3237..3545fde71d 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -146,6 +146,9 @@ static OOMPolicy arg_default_oom_policy;
static CPUSet arg_cpu_affinity;
static NUMAPolicy arg_numa_policy;
+/* A copy of the original environment block */
+static char **saved_env = NULL;
+
static int parse_configuration(const struct rlimit *saved_rlimit_nofile,
const struct rlimit *saved_rlimit_memlock);
@@ -2353,6 +2356,17 @@ static bool early_skip_setup_check(int argc, char *argv[]) {
return found_deserialize; /* When we are deserializing, then we are reexecuting, hence avoid the extensive setup */
}
+static int save_env(void) {
+ char **l;
+
+ l = strv_copy(environ);
+ if (!l)
+ return -ENOMEM;
+
+ strv_free_and_replace(saved_env, l);
+ return 0;
+}
+
int main(int argc, char *argv[]) {
dual_timestamp initrd_timestamp = DUAL_TIMESTAMP_NULL, userspace_timestamp = DUAL_TIMESTAMP_NULL, kernel_timestamp = DUAL_TIMESTAMP_NULL,
@@ -2391,9 +2405,13 @@ int main(int argc, char *argv[]) {
/* Save the original command line */
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();
+ /* Save the original environment as we might need to restore it if we're requested to execute another
+ * system manager later. */
+ r = save_env();
+ if (r < 0) {
+ error_message = "Failed to copy environment block";
+ goto finish;
+ }
/* Make sure that if the user says "syslog" we actually log to the journal. */
log_set_upgrade_syslog_to_journal(true);
@@ -2681,6 +2699,8 @@ finish:
arg_serialization = safe_fclose(arg_serialization);
fds = fdset_free(fds);
+ saved_env = strv_free(saved_env);
+
#if HAVE_VALGRIND_VALGRIND_H
/* If we are PID 1 and running under valgrind, then let's exit
* here explicitly. valgrind will only generate nice output on