lib/util: cope with races between lstat and mkdir in directory_create_or_exist()
authorStefan Metzmacher <metze@samba.org>
Wed, 14 Mar 2012 09:50:34 +0000 (10:50 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 14 Mar 2012 11:00:46 +0000 (12:00 +0100)
metze

lib/util/util.c

index 54a8c88245e39bc434144e80105f36b92d20a6bf..e3d22f361440f8fe00b723357dee171d8106b34e 100644 (file)
@@ -161,7 +161,7 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
 
                /* Create directory */
                ret = mkdir(dname, dir_perms);
-               if (ret == -1) {
+               if (ret == -1 && errno != EEXIST) {
                        DEBUG(0, ("mkdir failed on directory "
                                  "%s: %s\n", dname,
                                  strerror(errno)));
@@ -169,7 +169,13 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
                        return false;
                }
 
-               return true;
+               ret = lstat(dname, &st);
+               if (ret == -1) {
+                       DEBUG(0, ("lstat failed on created directory %s: %s\n",
+                                 dname, strerror(errno)));
+                       umask(old_umask);
+                       return false;
+               }
        }
 
        /* Check ownership and permission on existing directory */