From: Ronny Chevalier Date: Sun, 14 May 2017 14:30:40 +0000 (+0200) Subject: env-util: fix memory leak (#5962) X-Git-Tag: v234~203 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=16eefcafedeecf0e282add6c1eadeebcb3ad0609;p=platform%2Fupstream%2Fsystemd.git env-util: fix memory leak (#5962) If cunescape succeeds, but the assignment is not valid, uce is not freed. --- diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 1ec574e..e79b441 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -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); } diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index e5cc2a2..904c50f 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -314,6 +314,15 @@ static void test_env_assignment_is_valid(void) { assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;\x07\"")); } +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; }