]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/swap: fix memory management in swap_setup_unit
authorMike Yuan <me@yhndnzj.com>
Fri, 22 Mar 2024 10:26:55 +0000 (18:26 +0800)
committerMike Yuan <me@yhndnzj.com>
Fri, 22 Mar 2024 10:30:39 +0000 (18:30 +0800)
Follow-up for e9fa1bf704ad2f0a7e257e29889315118b0df459

src/core/swap.c

index e2019587ff40e7b07a3615ef142e3d0c9b0946db..afd067f0e0d5b26da9a4097a9fee35af7c559057 100644 (file)
@@ -374,11 +374,10 @@ static int swap_setup_unit(
                 int priority,
                 bool set_flags) {
 
+        _cleanup_(unit_freep) Unit *new = NULL;
         _cleanup_free_ char *e = NULL;
-        bool new;
         Unit *u;
         Swap *s;
-        SwapParameters *p;
         int r;
 
         assert(m);
@@ -395,43 +394,34 @@ static int swap_setup_unit(
 
                 if (s->from_proc_swaps &&
                     !path_equal(s->parameters_proc_swaps.what, what_proc_swaps))
-                        return log_error_errno(SYNTHETIC_ERRNO(EEXIST),
-                                               "Swap %s appeared twice with different device paths %s and %s, refusing.",
-                                               e, s->parameters_proc_swaps.what, what_proc_swaps);
-
-                new = false;
+                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EEXIST),
+                                                    "Swap appeared twice with different device paths %s and %s, refusing.",
+                                                    s->parameters_proc_swaps.what, what_proc_swaps);
         } else {
-                new = true;
-
-                r = unit_new_for_name(m, sizeof(Swap), e, &u);
-                if (r < 0) {
-                        log_unit_warning_errno(u, r, "Failed to load swap unit: %m");
-                        goto fail;
-                }
+                r = unit_new_for_name(m, sizeof(Swap), e, &new);
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to load swap unit '%s': %m", e);
 
+                u = new;
                 s = ASSERT_PTR(SWAP(u));
 
                 s->what = strdup(what);
-                if (s->what) {
-                        r = log_oom();
-                        goto fail;
-                }
+                if (!s->what)
+                        return log_oom();
 
                 unit_add_to_load_queue(u);
         }
 
-        p = &s->parameters_proc_swaps;
+        SwapParameters *p = &s->parameters_proc_swaps;
 
-        if (!s->parameters_proc_swaps.what) {
+        if (!p->what) {
                 p->what = strdup(what_proc_swaps);
-                if (!p->what) {
-                        r = log_oom();
-                        goto fail;
-                }
+                if (!p->what)
+                        return log_oom();
         }
 
-        /* The unit is definitely around now, mark it as loaded if it was previously referenced but could not be
-         * loaded. After all we can load it now, from the data in /proc/swaps. */
+        /* The unit is definitely around now, mark it as loaded if it was previously referenced but
+         * could not be loaded. After all we can load it now, from the data in /proc/swaps. */
         if (IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_BAD_SETTING, UNIT_ERROR)) {
                 u->load_state = UNIT_LOADED;
                 u->load_error = 0;
@@ -439,7 +429,7 @@ static int swap_setup_unit(
 
         if (set_flags) {
                 s->is_active = true;
-                s->just_activated = !SWAP(u)->from_proc_swaps;
+                s->just_activated = !s->from_proc_swaps;
         }
 
         s->from_proc_swaps = true;
@@ -449,12 +439,6 @@ static int swap_setup_unit(
 
         unit_add_to_dbus_queue(u);
         return 0;
-
-fail:
-        if (!new)
-                unit_free(u);
-
-        return r;
 }
 
 static void swap_process_new(Manager *m, const char *device, int prio, bool set_flags) {