The dir must start with '/'
authorJagger <robert@swiecki.net>
Thu, 18 Aug 2016 19:04:25 +0000 (21:04 +0200)
committerJagger <robert@swiecki.net>
Thu, 18 Aug 2016 19:04:25 +0000 (21:04 +0200)
util.c

diff --git a/util.c b/util.c
index 0cbca281bd9a047df52e4cd101fc829a27fdfee9..345843351048867168aa3f081ac67e6c9b1e3e9a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -114,19 +114,20 @@ bool utilWriteBufToFile(const char *filename, const void *buf, size_t len, int o
 
 bool utilCreateDirRecursively(const char *dir)
 {
-       int prev_dir_fd = AT_FDCWD;
-       char path[PATH_MAX];
-       snprintf(path, sizeof(path), "%s", dir);
+       if (dir[0] != '/') {
+               LOG_W("The directory path must start with '/': '%s' provided", dir);
+               return false;
+       }
 
-       char *curr = path;
-       if (*curr == '/') {
-               prev_dir_fd = open("/", O_RDONLY | O_CLOEXEC);
-               if (prev_dir_fd == -1) {
-                       PLOG_E("open('/', O_RDONLY | O_CLOEXEC)");
-                       return false;
-               }
+       int prev_dir_fd = open("/", O_RDONLY | O_CLOEXEC);
+       if (prev_dir_fd == -1) {
+               PLOG_E("open('/', O_RDONLY | O_CLOEXEC)");
+               return false;
        }
 
+       char path[PATH_MAX];
+       snprintf(path, sizeof(path), "%s", dir);
+       char *curr = path;
        for (;;) {
                while (*curr == '/') {
                        curr++;
@@ -141,6 +142,7 @@ bool utilCreateDirRecursively(const char *dir)
 
                if (mkdirat(prev_dir_fd, curr, 0755) == -1 && errno != EEXIST) {
                        PLOG_E("mkdir('%s', 0755)", curr);
+                       close(prev_dir_fd);
                        return false;
                }