From dd672431c0b8a3a416f6c244b131074d868250cc Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Wed, 11 Jun 2014 16:58:20 +1000 Subject: [PATCH] ctdb-common: No dynamic memory allocation in mkdir_p() Allocate an array of size PATH_MAX on the stack instead. To stop unnecessary recursion, try to create the desired directory before creating ancestors and only create ancestors on ENOENT. Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- ctdb/common/system_common.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/ctdb/common/system_common.c b/ctdb/common/system_common.c index cc22f69e37cb..7fc7425b0dba 100644 --- a/ctdb/common/system_common.c +++ b/ctdb/common/system_common.c @@ -162,7 +162,8 @@ char *ctdb_sys_find_ifname(ctdb_sock_addr *addr) int mkdir_p(const char *dir, int mode) { - char * t; + char t[PATH_MAX]; + ssize_t len; int ret; if (strcmp(dir, "/") == 0) { @@ -173,18 +174,34 @@ int mkdir_p(const char *dir, int mode) return 0; } - t = talloc_strdup(NULL, dir); - if (t == NULL) { - return ENOMEM; + /* Try to create directory */ + ret = mkdir(dir, mode); + /* Succeed if that worked or if it already existed */ + if (ret == 0 || errno == EEXIST) { + return 0; + } + /* Fail on anything else except ENOENT */ + if (errno != ENOENT) { + return ret; + } + + /* Create ancestors */ + len = strlen(dir); + if (len >= PATH_MAX) { + errno = ENAMETOOLONG; + return -1; } + strncpy(t, dir, len+1); + ret = mkdir_p(dirname(t), mode); - talloc_free(t); + if (ret != 0) { + return ret; + } - if (ret == 0) { - ret = mkdir(dir, mode); - if ((ret == -1) && (errno == EEXIST)) { - ret = 0; - } + /* Create directory */ + ret = mkdir(dir, mode); + if ((ret == -1) && (errno == EEXIST)) { + ret = 0; } return ret; -- 2.34.1