From: Harald Hoyer Date: Mon, 8 Apr 2013 12:05:24 +0000 (+0200) Subject: Do not serialize environment, when switching root X-Git-Tag: v201~24 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=b3680f49e20c51e31c8dea84a11207df7b8f0100;ds=sidebyside Do not serialize environment, when switching root When switching root, i.e. LANG can be set to the locale of the initramfs or "C", if it was unset. When systemd deserializes LANG in the real root this would overwrite the setting previously gathered by locale_set(). To reproduce, boot with an initramfs without locale.conf or change /etc/locale.conf to a different language than the initramfs and check a daemon started by systemd: $ tr "$\000" '\n' switch_root = m->switch_root_init = NULL; if (!switch_root_init) - if (prepare_reexecute(m, &serialization, &fds, false) < 0) + if (prepare_reexecute(m, &serialization, &fds, true) < 0) goto finish; reexecute = true; diff --git a/src/core/manager.c b/src/core/manager.c index 549153e05..f8d097e36 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2004,7 +2004,7 @@ int manager_open_serialization(Manager *m, FILE **_f) { return 0; } -int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) { +int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) { Iterator i; Unit *u; const char *t; @@ -2032,12 +2032,14 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) { dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp); } - STRV_FOREACH(e, m->environment) { - _cleanup_free_ char *ce; + if (!switching_root) { + STRV_FOREACH(e, m->environment) { + _cleanup_free_ char *ce; - ce = cescape(*e); - if (ce) - fprintf(f, "env=%s\n", *e); + ce = cescape(*e); + if (ce) + fprintf(f, "env=%s\n", *e); + } } fputc('\n', f); @@ -2053,7 +2055,7 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) { fputs(u->id, f); fputc('\n', f); - if ((r = unit_serialize(u, f, fds, serialize_jobs)) < 0) { + if ((r = unit_serialize(u, f, fds, !switching_root)) < 0) { m->n_reloading --; return r; } @@ -2241,7 +2243,7 @@ int manager_reload(Manager *m) { goto finish; } - r = manager_serialize(m, f, fds, true); + r = manager_serialize(m, f, fds, false); if (r < 0) { m->n_reloading --; goto finish; diff --git a/src/core/manager.h b/src/core/manager.h index 9d8d9439d..649a8aac5 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -278,7 +278,7 @@ void manager_dispatch_bus_query_pid_done(Manager *m, const char *name, pid_t pid int manager_open_serialization(Manager *m, FILE **_f); -int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs); +int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root); int manager_deserialize(Manager *m, FILE *f, FDSet *fds); int manager_distribute_fds(Manager *m, FDSet *fds);