Merge pull request #13909 from poettering/env-copy-pid
Fixes for the "saved_env" copy logic
This commit is contained in:
@@ -40,8 +40,8 @@ typedef struct StaticDestructor {
|
||||
extern const struct StaticDestructor _weak_ __start_SYSTEMD_STATIC_DESTRUCT[];
|
||||
extern const struct StaticDestructor _weak_ __stop_SYSTEMD_STATIC_DESTRUCT[];
|
||||
|
||||
/* The function to destroy everything. (Note that this must be static inline, as it's key that it remains in the same
|
||||
* linking unit as the variables we want to destroy. */
|
||||
/* The function to destroy everything. (Note that this must be static inline, as it's key that it remains in
|
||||
* the same linking unit as the variables we want to destroy.) */
|
||||
static inline void static_destruct(void) {
|
||||
const StaticDestructor *d;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
+23
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user