Zbigniew Jędrzejewski-Szmek 5d6eed
From 83d9a6e89af9caebe109c5f309c7bc2d82bd8fc4 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 03e93e
From: Jan Synacek <jan.synacek@gmail.com>
Zbigniew Jędrzejewski-Szmek 03e93e
Date: Tue, 3 Jan 2017 21:34:36 +0100
Zbigniew Jędrzejewski-Szmek 03e93e
Subject: [PATCH] shared: fix double free in unmask (#5005)
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
Easily reproducible:
Zbigniew Jędrzejewski-Szmek 03e93e
1) systemctl mask foo
Zbigniew Jędrzejewski-Szmek 03e93e
2) systemctl unmask foo foo
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
The problem here is that the *i that is put into todo[] is later freed
Zbigniew Jędrzejewski-Szmek 03e93e
in strv_uniq(), which is not directly visible from this patch. Somewhere
Zbigniew Jędrzejewski-Szmek 03e93e
further in the code, the string that *i pointed to is freed again. That
Zbigniew Jędrzejewski-Szmek 03e93e
happens only when multiple services with the same name/path are specified.
Zbigniew Jędrzejewski-Szmek 03e93e
(cherry picked from commit dc7dd61de610e9330abe7014860acfa733887d5e)
Zbigniew Jędrzejewski-Szmek 03e93e
---
Zbigniew Jędrzejewski-Szmek 03e93e
 src/shared/install.c | 4 ++--
Zbigniew Jędrzejewski-Szmek 03e93e
 1 file changed, 2 insertions(+), 2 deletions(-)
Zbigniew Jędrzejewski-Szmek 03e93e
Zbigniew Jędrzejewski-Szmek 03e93e
diff --git a/src/shared/install.c b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 03e93e
index 96fba6e25b..5f0eec3ccb 100644
Zbigniew Jędrzejewski-Szmek 03e93e
--- a/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 03e93e
+++ b/src/shared/install.c
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -1861,7 +1861,7 @@ int unit_file_unmask(
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         _cleanup_lookup_paths_free_ LookupPaths paths = {};
Zbigniew Jędrzejewski-Szmek 03e93e
         _cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
-        _cleanup_free_ char **todo = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
+        _cleanup_strv_free_ char **todo = NULL;
Zbigniew Jędrzejewski-Szmek 03e93e
         size_t n_todo = 0, n_allocated = 0;
Zbigniew Jędrzejewski-Szmek 03e93e
         const char *config_path;
Zbigniew Jędrzejewski-Szmek 03e93e
         char **i;
Zbigniew Jędrzejewski-Szmek 03e93e
@@ -1899,7 +1899,7 @@ int unit_file_unmask(
Zbigniew Jędrzejewski-Szmek 03e93e
                 if (!GREEDY_REALLOC0(todo, n_allocated, n_todo + 2))
Zbigniew Jędrzejewski-Szmek 03e93e
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
-                todo[n_todo++] = *i;
Zbigniew Jędrzejewski-Szmek 03e93e
+                todo[n_todo++] = strdup(*i);
Zbigniew Jędrzejewski-Szmek 03e93e
         }
Zbigniew Jędrzejewski-Szmek 03e93e
 
Zbigniew Jędrzejewski-Szmek 03e93e
         strv_uniq(todo);