From ba31a5018f99864c22dd4e0f10712456c7abc934 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Fri, 22 Mar 2024 18:26:55 +0800 Subject: [PATCH] core/swap: fix memory management in swap_setup_unit Follow-up for e9fa1bf704ad2f0a7e257e29889315118b0df459 --- src/core/swap.c | 50 +++++++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/core/swap.c b/src/core/swap.c index e2019587ff4..afd067f0e0d 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -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) { -- 2.39.2