diff --git a/src/core/manager.c b/src/core/manager.c index c361a70b79..fb0743b3d7 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -1696,6 +1696,7 @@ int manager_load_unit_prepare( sd_bus_error *e, Unit **_ret) { + _cleanup_(unit_freep) Unit *cleanup_ret = NULL; Unit *ret; UnitType t; int r; @@ -1728,29 +1729,26 @@ int manager_load_unit_prepare( return 1; } - ret = unit_new(m, unit_vtable[t]->object_size); + ret = cleanup_ret = unit_new(m, unit_vtable[t]->object_size); if (!ret) return -ENOMEM; if (path) { ret->fragment_path = strdup(path); - if (!ret->fragment_path) { - unit_free(ret); + if (!ret->fragment_path) return -ENOMEM; - } } r = unit_add_name(ret, name); - if (r < 0) { - unit_free(ret); + if (r < 0) return r; - } unit_add_to_load_queue(ret); unit_add_to_dbus_queue(ret); unit_add_to_gc_queue(ret); *_ret = ret; + cleanup_ret = NULL; return 0; } diff --git a/src/core/unit.c b/src/core/unit.c index c3056624ef..815701ad4e 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -128,7 +128,7 @@ Unit *unit_new(Manager *m, size_t size) { } int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret) { - Unit *u; + _cleanup_(unit_freep) Unit *u = NULL; int r; u = unit_new(m, size); @@ -136,12 +136,11 @@ int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret) { return -ENOMEM; r = unit_add_name(u, name); - if (r < 0) { - unit_free(u); + if (r < 0) return r; - } *ret = u; + u = NULL; return r; } diff --git a/src/core/unit.h b/src/core/unit.h index e903bf8ad7..e9370a4b93 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -610,6 +610,7 @@ DEFINE_CAST(SCOPE, Scope); Unit *unit_new(Manager *m, size_t size); void unit_free(Unit *u); +DEFINE_TRIVIAL_CLEANUP_FUNC(Unit *, unit_free); int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret); int unit_add_name(Unit *u, const char *name); diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c index f52a853c98..beb41e97bd 100644 --- a/src/test/test-unit-file.c +++ b/src/test/test-unit-file.c @@ -114,7 +114,7 @@ static void test_config_parse_exec(void) { ExecCommand *c = NULL, *c1; const char *ccc; _cleanup_(manager_freep) Manager *m = NULL; - Unit *u = NULL; + _cleanup_(unit_freep) Unit *u = NULL; r = manager_new(UNIT_FILE_USER, MANAGER_TEST_RUN_MINIMAL, &m); if (MANAGER_SKIP_TEST(r)) { @@ -441,8 +441,6 @@ static void test_config_parse_exec(void) { assert_se(c == NULL); exec_command_free_list(c); - - unit_free(u); } static void test_config_parse_log_extra_fields(void) { @@ -461,7 +459,7 @@ static void test_config_parse_log_extra_fields(void) { int r; _cleanup_(manager_freep) Manager *m = NULL; - Unit *u = NULL; + _cleanup_(unit_freep) Unit *u = NULL; ExecContext c = {}; r = manager_new(UNIT_FILE_USER, MANAGER_TEST_RUN_MINIMAL, &m); @@ -506,8 +504,6 @@ static void test_config_parse_log_extra_fields(void) { exec_context_free_log_extra_fields(&c); - unit_free(u); - log_info("/* %s – bye */", __func__); }