diff options
author | Michael Paquier <michael@paquier.xyz> | 2023-07-31 11:36:44 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2023-07-31 11:36:44 +0900 |
commit | f1e9f6bbfa536992eac6c094882b3afcd9e90fb4 (patch) | |
tree | 9a9396f0885689da09dfdd42a17e64c6153787e9 /src | |
parent | bf227926d22b5cffba4b6724df0eb239a7037cbd (diff) | |
download | postgresql-f1e9f6bbfa536992eac6c094882b3afcd9e90fb4.tar.gz postgresql-f1e9f6bbfa536992eac6c094882b3afcd9e90fb4.zip |
Avoid memory leak in rmtree() when path cannot be opened
An allocation done for the directory names to recurse into for their
deletion was done before OPENDIR(), so, assuming that a failure happens,
this could leak a bit of memory.
Author: Ranier Vilela
Reviewed-by: Daniel Gustafsson
Discussion: https://postgr.es/m/CAEudQAoN3-2ZKBALThnEk_q2hu8En5A0WG9O+5siJTQKVZzoWQ@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/common/rmtree.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/common/rmtree.c b/src/common/rmtree.c index cd99d3f4719..fdc37093218 100644 --- a/src/common/rmtree.c +++ b/src/common/rmtree.c @@ -55,7 +55,7 @@ rmtree(const char *path, bool rmtopdir) bool result = true; size_t dirnames_size = 0; size_t dirnames_capacity = 8; - char **dirnames = palloc(sizeof(char *) * dirnames_capacity); + char **dirnames; dir = OPENDIR(path); if (dir == NULL) @@ -64,6 +64,8 @@ rmtree(const char *path, bool rmtopdir) return false; } + dirnames = (char **) palloc(sizeof(char *) * dirnames_capacity); + while (errno = 0, (de = readdir(dir))) { if (strcmp(de->d_name, ".") == 0 || |