Author: mjg
Date: Tue Sep 23 11:41:09 2014
New Revision: 272026
URL: http://svnweb.freebsd.org/changeset/base/272026

Log:
  install: re-check failed mkdir for EEXIST
  
  Since the code stats and mkdirs in 2 separate steps, it is possible that
  the directory will be created in the meantime by something else (e.g.
  concurrent install).[1]
  
  While here alter the code to properly report stat failure, previously it
  would always claim it was mkdir which failed.
  
  Noted by: royger [1]
  MFC after:    1 week

Modified:
  head/usr.bin/xinstall/xinstall.c

Modified: head/usr.bin/xinstall/xinstall.c
==============================================================================
--- head/usr.bin/xinstall/xinstall.c    Tue Sep 23 11:27:43 2014        
(r272025)
+++ head/usr.bin/xinstall/xinstall.c    Tue Sep 23 11:41:09 2014        
(r272026)
@@ -1263,13 +1263,18 @@ install_dir(char *path)
                if (!*p || (p != path && *p  == '/')) {
                        ch = *p;
                        *p = '\0';
-                       if (stat(path, &sb)) {
-                               if (errno != ENOENT || mkdir(path, 0755) < 0) {
+again:
+                       if (stat(path, &sb) < 0) {
+                               if (errno != ENOENT)
+                                       err(EX_OSERR, "stat %s", path);
+                               if (mkdir(path, 0755) < 0) {
+                                       if (errno == EEXIST)
+                                               goto again;
                                        err(EX_OSERR, "mkdir %s", path);
-                                       /* NOTREACHED */
-                               } else if (verbose)
+                               }
+                               if (verbose)
                                        (void)printf("install: mkdir %s\n",
-                                                    path);
+                                           path);
                        } else if (!S_ISDIR(sb.st_mode))
                                errx(EX_OSERR, "%s exists but is not a 
directory", path);
                        if (!(*p = ch))
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to