chiark / gitweb /
mount: be more careful about errors when parsing mtab
[elogind.git] / src / core / mount.c
index 5f2de64eb99d9d5e6e492ad6913708f9c2d2ebb6..679d15c50a4767618d6e4d803dc6fe060cc914ce 100644 (file)
@@ -1441,17 +1441,13 @@ static int mount_add_one(
                         }
                 }
 
-                if (m->running_as == SYSTEMD_SYSTEM) {
-                        const char* target;
-
-                        target = mount_needs_network(options, fstype) ?  SPECIAL_REMOTE_FS_TARGET : NULL;
+                if (m->running_as == SYSTEMD_SYSTEM &&
+                    mount_needs_network(options, fstype)) {
                         /* _netdev option may have shown up late, or on a
                          * remount. Add remote-fs dependencies, even though
-                         * local-fs ones may already be there */
-                        if (target) {
-                                unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
-                                load_extras = true;
-                        }
+                         * local-fs ones may already be there. */
+                        unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_REMOTE_FS_TARGET, NULL, true);
+                        load_extras = true;
                 }
 
                 if (u->load_state == UNIT_NOT_FOUND) {
@@ -1539,15 +1535,22 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
         if (!tb || !itr)
                 return log_oom();
 
-        mnt_table_parse_mtab(tb, NULL);
-        if (r)
+        r = mnt_table_parse_mtab(tb, NULL);
+        if (r < 0)
                 return r;
 
-        while (mnt_table_next_fs(tb, itr, &fs) == 0) {
+        r = 0;
+        for (;;) {
                 const char *device, *path, *options, *fstype;
                 _cleanup_free_ const char *d = NULL, *p = NULL;
                 int k;
 
+                k = mnt_table_next_fs(tb, itr, &fs);
+                if (k == 1)
+                        break;
+                else if (k < 0)
+                        return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m");
+
                 device = mnt_fs_get_source(fs);
                 path = mnt_fs_get_target(fs);
                 options = mnt_fs_get_options(fs);
@@ -1559,7 +1562,7 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
                         return log_oom();
 
                 k = mount_add_one(m, d, p, options, fstype, set_flags);
-                if (k < 0)
+                if (r == 0 && k < 0)
                         r = k;
         }