chiark / gitweb /
Do not serialize environment, when switching root
authorHarald Hoyer <harald@redhat.com>
Mon, 8 Apr 2013 12:05:24 +0000 (14:05 +0200)
committerHarald Hoyer <harald@redhat.com>
Mon, 8 Apr 2013 12:45:19 +0000 (14:45 +0200)
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' </proc/$(pidof sshd)/environ | grep LANG
LANG=C

To prevent that, serialization of environment variables is skipped, when
serializing for switching root.

https://bugzilla.redhat.com/show_bug.cgi?id=949525

src/core/main.c
src/core/manager.c
src/core/manager.h

index 921476a042c7d9be0f0b82ee18042f84eb1cf074..789976108a7f16de8448581da9d38ef56310a16d 100644 (file)
@@ -1088,7 +1088,7 @@ static int version(void) {
         return 0;
 }
 
-static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool serialize_jobs) {
+static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching_root) {
         FILE *f = NULL;
         FDSet *fds = NULL;
         int r;
@@ -1113,7 +1113,7 @@ static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool serialize
                 goto fail;
         }
 
-        r = manager_serialize(m, f, fds, serialize_jobs);
+        r = manager_serialize(m, f, fds, switching_root);
         if (r < 0) {
                 log_error("Failed to serialize state: %s", strerror(-r));
                 goto fail;
@@ -1780,7 +1780,7 @@ int main(int argc, char *argv[]) {
 
                 case MANAGER_REEXECUTE:
 
-                        if (prepare_reexecute(m, &serialization, &fds, true) < 0)
+                        if (prepare_reexecute(m, &serialization, &fds, false) < 0)
                                 goto finish;
 
                         reexecute = true;
@@ -1794,7 +1794,7 @@ int main(int argc, char *argv[]) {
                         m->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;
index 549153e057493d2b9db7c06511f1f7bee0375c01..f8d097e368aac39c8925f53016dd4012ffe349e1 100644 (file)
@@ -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;
index 9d8d9439d2a426420042440f9236e4cace6014e1..649a8aac514d184490425bf530c162694bae9715 100644 (file)
@@ -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);