mirror of
https://github.com/systemd/systemd.git
synced 2026-07-17 13:00:35 +00:00
shared: fix double free in unmask (#5005)
Easily reproducible: 1) systemctl mask foo 2) systemctl unmask foo foo The problem here is that the *i that is put into todo[] is later freed in strv_uniq(), which is not directly visible from this patch. Somewhere further in the code, the string that *i pointed to is freed again. That happens only when multiple services with the same name/path are specified.
This commit is contained in:
@@ -1855,7 +1855,7 @@ int unit_file_unmask(
|
||||
|
||||
_cleanup_lookup_paths_free_ LookupPaths paths = {};
|
||||
_cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
|
||||
_cleanup_free_ char **todo = NULL;
|
||||
_cleanup_strv_free_ char **todo = NULL;
|
||||
size_t n_todo = 0, n_allocated = 0;
|
||||
const char *config_path;
|
||||
char **i;
|
||||
@@ -1893,7 +1893,7 @@ int unit_file_unmask(
|
||||
if (!GREEDY_REALLOC0(todo, n_allocated, n_todo + 2))
|
||||
return -ENOMEM;
|
||||
|
||||
todo[n_todo++] = *i;
|
||||
todo[n_todo++] = strdup(*i);
|
||||
}
|
||||
|
||||
strv_uniq(todo);
|
||||
|
||||
Reference in New Issue
Block a user