From 9f60a77e0b4c8ad06a8156ff5b5ebc5902d4ec17 Mon Sep 17 00:00:00 2001 From: Christof Schmitt Date: Wed, 29 Aug 2018 12:04:29 -0700 Subject: [PATCH] lib: Fix lstat check in directory_create_or_exist The lstat check in directory_create_or_exist did not verify whether an existing object is actually a directory. Also move the check to only apply when mkdir returns EEXIST; this fixes CID 241930 Time of check time of use. Signed-off-by: Christof Schmitt Reviewed-by: Andreas Schneider --- lib/util/util.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/lib/util/util.c b/lib/util/util.c index 4291bfa5d57..f52f69c6ef0 100644 --- a/lib/util/util.c +++ b/lib/util/util.c @@ -194,20 +194,8 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, mode_t dir_perms) { int ret; - struct stat st; mode_t old_umask; - ret = lstat(dname, &st); - if (ret == 0) { - return true; - } - - if (errno != ENOENT) { - DBG_WARNING("lstat failed on directory %s: %s\n", - dname, strerror(errno)); - return false; - } - /* Create directory */ old_umask = umask(0); ret = mkdir(dname, dir_perms); @@ -220,11 +208,17 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, } umask(old_umask); - ret = lstat(dname, &st); - if (ret == -1) { - DEBUG(0, ("lstat failed on created directory %s: %s\n", - dname, strerror(errno))); - return false; + if (ret != 0 && errno == EEXIST) { + struct stat sbuf; + + ret = lstat(dname, &sbuf); + if (ret != 0) { + return false; + } + + if (!S_ISDIR(sbuf.st_mode)) { + return false; + } } return true; -- 2.47.2