lib: Fix lstat check in directory_create_or_exist
authorChristof Schmitt <cs@samba.org>
Wed, 29 Aug 2018 19:04:29 +0000 (12:04 -0700)
committerChristof Schmitt <cs@samba.org>
Thu, 30 Aug 2018 16:07:14 +0000 (18:07 +0200)
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 <cs@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
lib/util/util.c

index 4291bfa5d57f8f08e4ee2dd8c33749cf25fb7bc1..f52f69c6ef01599e5099c799a1f8e59f164a9294 100644 (file)
@@ -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;