From 6770131e94eb1f529ec6e8c7f39302a2d22f87f6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 3 Apr 2025 13:27:51 +1000 Subject: [PATCH] util: fix a memleak in mkdir_p In the error case path would leak. Part-of: --- src/util-files.h | 6 +++--- test/test-utils.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/util-files.h b/src/util-files.h index 38e151a5..1c1639d4 100644 --- a/src/util-files.h +++ b/src/util-files.h @@ -43,14 +43,14 @@ mkdir_p(const char *dir) path = safe_strdup(dir); parent = dirname(path); + rc = mkdir_p(parent); + free(path); - if ((rc = mkdir_p(parent)) < 0) + if (rc < 0) return rc; rc = mkdir(dir, 0755); - free(path); - return (rc == -1 && errno != EEXIST) ? -errno : 0; } diff --git a/test/test-utils.c b/test/test-utils.c index 56511500..6bafebe4 100644 --- a/test/test-utils.c +++ b/test/test-utils.c @@ -25,11 +25,13 @@ #include +#include #include #include #include "litest.h" #include "litest-runner.h" +#include "util-files.h" #include "util-list.h" #include "util-strings.h" #include "util-time.h" @@ -48,6 +50,21 @@ #define TEST_VERSIONSORT #include "libinput-versionsort.h" +START_TEST(mkdir_p_test) +{ + const char *testdir = "/tmp/litest_mkdir_test"; + litest_assert_neg_errno_success(mkdir_p("/")); + + unlink(testdir); + litest_assert_neg_errno_success(mkdir_p(testdir)); + /* EEXIST is not an error */ + litest_assert_neg_errno_success(mkdir_p(testdir)); + unlink(testdir); + + litest_assert_int_eq(mkdir_p("/proc/foo"), -ENOENT); +} +END_TEST + START_TEST(array_for_each) { int ai[6]; @@ -2048,6 +2065,8 @@ int main(void) litest_runner_add_test(runner, &tdesc); \ } while(0) + ADD_TEST(mkdir_p_test); + ADD_TEST(array_for_each); ADD_TEST(bitfield_helpers);