env-util: fix memory leak (#5962)
authorRonny Chevalier <chevalier.ronny@gmail.com>
Sun, 14 May 2017 14:30:40 +0000 (16:30 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 14 May 2017 14:30:40 +0000 (10:30 -0400)
If cunescape succeeds, but the assignment is not valid, uce is not freed.

src/basic/env-util.c
src/test/test-env-util.c

index 1ec574e..e79b441 100644 (file)
@@ -799,8 +799,10 @@ int deserialize_environment(char ***environment, const char *line) {
         if (r < 0)
                 return r;
 
-        if (!env_assignment_is_valid(uce))
+        if (!env_assignment_is_valid(uce)) {
+                free(uce);
                 return -EINVAL;
+        }
 
         return strv_env_replace(environment, uce);
 }
index e5cc2a2..904c50f 100644 (file)
@@ -314,6 +314,15 @@ static void test_env_assignment_is_valid(void) {
         assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;<mock-chroot>\x07<mock-chroot>\""));
 }
 
+static void test_deserialize_environment(void) {
+        _cleanup_strv_free_ char **env = strv_new("A=1", NULL);
+
+        assert_se(deserialize_environment(&env, "env=test") < 0);
+        assert_se(deserialize_environment(&env, "env=B=2") >= 0);
+
+        assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2")));
+}
+
 int main(int argc, char *argv[]) {
         test_strv_env_delete();
         test_strv_env_get();
@@ -330,6 +339,7 @@ int main(int argc, char *argv[]) {
         test_env_name_is_valid();
         test_env_value_is_valid();
         test_env_assignment_is_valid();
+        test_deserialize_environment();
 
         return 0;
 }