From: Frantisek Sumsal Date: Mon, 6 Jul 2020 13:22:28 +0000 (+0200) Subject: unit-name: fix a potential memory leak X-Git-Tag: v246-rc1~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a61e8fca216f27ab26c490cfaac03f77028b174;p=thirdparty%2Fsystemd.git unit-name: fix a potential memory leak Also, add a test which verifies the issue is indeed gone. Fixes: CID#1429014 Followup to: ab19db01ae1826efb3cbdf6dcb6a14412f8844d4 --- diff --git a/src/basic/unit-name.c b/src/basic/unit-name.c index 10405b711f6..43d8b3477e1 100644 --- a/src/basic/unit-name.c +++ b/src/basic/unit-name.c @@ -537,8 +537,7 @@ int unit_name_from_path(const char *path, const char *suffix, char **ret) { } int unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix, char **ret) { - _cleanup_free_ char *p = NULL; - char *s; + _cleanup_free_ char *p = NULL, *s = NULL; int r; assert(prefix); @@ -564,7 +563,7 @@ int unit_name_from_path_instance(const char *prefix, const char *path, const cha if (!unit_name_is_valid(s, UNIT_NAME_INSTANCE)) return -EINVAL; - *ret = s; + *ret = TAKE_PTR(s); return 0; } diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c index 6e294c72d62..0d524f9a562 100644 --- a/src/test/test-unit-name.c +++ b/src/test/test-unit-name.c @@ -130,6 +130,7 @@ static void test_unit_name_from_path(void) { test_unit_name_from_path_one("///", ".mount", "-.mount", 0); test_unit_name_from_path_one("/foo/../bar", ".mount", NULL, -EINVAL); test_unit_name_from_path_one("/foo/./bar", ".mount", NULL, -EINVAL); + test_unit_name_from_path_one("/waldoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", ".mount", NULL, -EINVAL); } static void test_unit_name_from_path_instance_one(const char *pattern, const char *path, const char *suffix, const char *expected, int ret) { @@ -159,6 +160,7 @@ static void test_unit_name_from_path_instance(void) { test_unit_name_from_path_instance_one("waldo", "..", ".mount", NULL, -EINVAL); test_unit_name_from_path_instance_one("waldo", "/foo", ".waldi", NULL, -EINVAL); test_unit_name_from_path_instance_one("wa--ldo", "/--", ".mount", "wa--ldo@\\x2d\\x2d.mount", 0); + test_unit_name_from_path_instance_one("waldoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "/waldo", ".mount", NULL, -EINVAL); } static void test_unit_name_to_path_one(const char *unit, const char *path, int ret) {