[systemd-commits] src/core

Lennart Poettering lennart at kemper.freedesktop.org
Tue Oct 16 10:52:18 PDT 2012


 src/core/mount.c  |   14 +++++++++++---
 src/core/socket.c |    9 ++++++---
 2 files changed, 17 insertions(+), 6 deletions(-)

New commits:
commit b87705cdd2f791f8520edb78791d3e6f78afd481
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Oct 16 19:50:26 2012 +0200

    mount: don't try to initialize extra deps for mount units before initializing their basic fields
    
    Under some circumstances this could lead to a segfault since we we
    half-initialized a mount unit, then tried to hook it into the network of
    things and while doing that recursively ended up looking at our
    half-initialized mount unit again assuming it was fully initialized.

diff --git a/src/core/mount.c b/src/core/mount.c
index 3e40e3f..e1c240e 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1408,6 +1408,7 @@ static int mount_add_one(
         bool delete;
         char *e, *w = NULL, *o = NULL, *f = NULL;
         MountParameters *p;
+        bool load_extras = false;
 
         assert(m);
         assert(what);
@@ -1461,9 +1462,10 @@ static int mount_add_one(
                 if (u->load_state == UNIT_ERROR) {
                         u->load_state = UNIT_LOADED;
                         u->load_error = 0;
-                        r = mount_add_extras(MOUNT(u));
-                        if (r < 0)
-                                goto fail;
+
+                        /* Load in the extras later on, after we
+                         * finished initialization of the unit */
+                        load_extras = true;
                 }
         }
 
@@ -1494,6 +1496,12 @@ static int mount_add_one(
 
         p->passno = passno;
 
+        if (load_extras) {
+                r = mount_add_extras(MOUNT(u));
+                if (r < 0)
+                        goto fail;
+        }
+
         unit_add_to_dbus_queue(u);
 
         return 0;
diff --git a/src/core/socket.c b/src/core/socket.c
index 26e7fd2..71cdf2d 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -265,7 +265,8 @@ int socket_add_one_mount_link(Socket *s, Mount *m) {
         if (!socket_needs_mount(s, m->where))
                 return 0;
 
-        if ((r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true)) < 0)
+        r = unit_add_two_dependencies(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
+        if (r < 0)
                 return r;
 
         return 0;
@@ -277,9 +278,11 @@ static int socket_add_mount_links(Socket *s) {
 
         assert(s);
 
-        LIST_FOREACH(units_by_type, other, UNIT(s)->manager->units_by_type[UNIT_MOUNT])
-                if ((r = socket_add_one_mount_link(s, MOUNT(other))) < 0)
+        LIST_FOREACH(units_by_type, other, UNIT(s)->manager->units_by_type[UNIT_MOUNT]) {
+                r = socket_add_one_mount_link(s, MOUNT(other));
+                if (r < 0)
                         return r;
+        }
 
         return 0;
 }



More information about the systemd-commits mailing list