From 52c788e6e069dc9ed1f651683ac4248d58e6f453 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Fri, 14 Apr 2023 09:43:43 +0200 Subject: [PATCH 1/3] install: fix memory leak if GREEDY_REALLOC() fails --- src/shared/install.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/shared/install.c b/src/shared/install.c index 964092456f..604e7c6300 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -78,14 +78,19 @@ static bool install_info_has_also(const InstallInfo *i) { return !strv_isempty(i->also); } +static void unit_file_preset_rule_done(UnitFilePresetRule *rule) { + assert(rule); + + free(rule->pattern); + strv_free(rule->instances); +} + void unit_file_presets_freep(UnitFilePresets *p) { if (!p) return; - for (size_t i = 0; i < p->n_rules; i++) { - free(p->rules[i].pattern); - strv_free(p->rules[i].instances); - } + for (size_t i = 0; i < p->n_rules; i++) + unit_file_preset_rule_done(&p->rules[i]); free(p->rules); p->n_rules = 0; @@ -3241,7 +3246,7 @@ static int read_presets(RuntimeScope scope, const char *root_dir, UnitFilePreset for (;;) { _cleanup_free_ char *line = NULL; - UnitFilePresetRule rule = {}; + _cleanup_(unit_file_preset_rule_done) UnitFilePresetRule rule = {}; const char *parameter; char *l; @@ -3296,7 +3301,7 @@ static int read_presets(RuntimeScope scope, const char *root_dir, UnitFilePreset if (!GREEDY_REALLOC(ps.rules, ps.n_rules + 1)) return -ENOMEM; - ps.rules[ps.n_rules++] = rule; + ps.rules[ps.n_rules++] = TAKE_STRUCT(rule); continue; } From 05cdf6a7013457ad2881eb6f2c49f5c4d26b7bce Mon Sep 17 00:00:00 2001 From: David Tardon Date: Fri, 14 Apr 2023 09:51:27 +0200 Subject: [PATCH 2/3] tree-wide: rename cleanup function ... with accordance to the current coding style. --- src/shared/install.c | 10 +++++----- src/shared/install.h | 2 +- src/systemctl/systemctl-list-unit-files.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/shared/install.c b/src/shared/install.c index 604e7c6300..524ee18762 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -85,7 +85,7 @@ static void unit_file_preset_rule_done(UnitFilePresetRule *rule) { strv_free(rule->instances); } -void unit_file_presets_freep(UnitFilePresets *p) { +void unit_file_presets_done(UnitFilePresets *p) { if (!p) return; @@ -3220,7 +3220,7 @@ static int presets_find_config(RuntimeScope scope, const char *root_dir, char ** } static int read_presets(RuntimeScope scope, const char *root_dir, UnitFilePresets *presets) { - _cleanup_(unit_file_presets_freep) UnitFilePresets ps = {}; + _cleanup_(unit_file_presets_done) UnitFilePresets ps = {}; _cleanup_strv_free_ char **files = NULL; int r; @@ -3400,7 +3400,7 @@ static int query_presets(const char *name, const UnitFilePresets *presets, char } int unit_file_query_preset(RuntimeScope scope, const char *root_dir, const char *name, UnitFilePresets *cached) { - _cleanup_(unit_file_presets_freep) UnitFilePresets tmp = {}; + _cleanup_(unit_file_presets_done) UnitFilePresets tmp = {}; int r; if (!cached) @@ -3526,7 +3526,7 @@ int unit_file_preset( _cleanup_(install_context_done) InstallContext plus = {}, minus = {}; _cleanup_(lookup_paths_free) LookupPaths lp = {}; - _cleanup_(unit_file_presets_freep) UnitFilePresets presets = {}; + _cleanup_(unit_file_presets_done) UnitFilePresets presets = {}; const char *config_path; int r; @@ -3565,7 +3565,7 @@ int unit_file_preset_all( _cleanup_(install_context_done) InstallContext plus = {}, minus = {}; _cleanup_(lookup_paths_free) LookupPaths lp = {}; - _cleanup_(unit_file_presets_freep) UnitFilePresets presets = {}; + _cleanup_(unit_file_presets_done) UnitFilePresets presets = {}; const char *config_path = NULL; int r; diff --git a/src/shared/install.h b/src/shared/install.h index 2067969f83..9b27a046b9 100644 --- a/src/shared/install.h +++ b/src/shared/install.h @@ -217,7 +217,7 @@ typedef struct { bool initialized; } UnitFilePresets; -void unit_file_presets_freep(UnitFilePresets *p); +void unit_file_presets_done(UnitFilePresets *p); int unit_file_query_preset(RuntimeScope scope, const char *root_dir, const char *name, UnitFilePresets *cached); const char *unit_file_state_to_string(UnitFileState s) _const_; diff --git a/src/systemctl/systemctl-list-unit-files.c b/src/systemctl/systemctl-list-unit-files.c index 69f0d977c1..4b15e1ca6c 100644 --- a/src/systemctl/systemctl-list-unit-files.c +++ b/src/systemctl/systemctl-list-unit-files.c @@ -51,7 +51,7 @@ static bool output_show_unit_file(const UnitFileList *u, char **states, char **p static int output_unit_file_list(const UnitFileList *units, unsigned c) { _cleanup_(table_unrefp) Table *table = NULL; - _cleanup_(unit_file_presets_freep) UnitFilePresets presets = {}; + _cleanup_(unit_file_presets_done) UnitFilePresets presets = {}; int r; table = table_new("unit file", "state", "preset"); From f52477d6112f15d9e94f30e98cceecaec1e16252 Mon Sep 17 00:00:00 2001 From: David Tardon Date: Fri, 14 Apr 2023 10:21:17 +0200 Subject: [PATCH 3/3] install: use FOREACH_ARRAY --- src/shared/install.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/install.c b/src/shared/install.c index 524ee18762..a95206a1aa 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -89,8 +89,8 @@ void unit_file_presets_done(UnitFilePresets *p) { if (!p) return; - for (size_t i = 0; i < p->n_rules; i++) - unit_file_preset_rule_done(&p->rules[i]); + FOREACH_ARRAY(rule, p->rules, p->n_rules) + unit_file_preset_rule_done(rule); free(p->rules); p->n_rules = 0;