svn commit: trunk/busybox/libbb

vda at busybox.net vda at busybox.net
Fri Aug 15 19:18:36 UTC 2008


Author: vda
Date: 2008-08-15 12:18:35 -0700 (Fri, 15 Aug 2008)
New Revision: 23083

Log:
mkdir: fix "uname 0222; mkdir foo/bar" case
 (by Doug Graham <dgraham AT nortel.com>)

function                                             old     new   delta
bb_make_directory                                    291     280     -11



Modified:
   trunk/busybox/libbb/make_directory.c


Changeset:
Modified: trunk/busybox/libbb/make_directory.c
===================================================================
--- trunk/busybox/libbb/make_directory.c	2008-08-15 05:28:09 UTC (rev 23082)
+++ trunk/busybox/libbb/make_directory.c	2008-08-15 19:18:35 UTC (rev 23083)
@@ -35,17 +35,10 @@
 	struct stat st;
 
 	mask = umask(0);
-	if (mode == -1) {
-		umask(mask);
-		mode = (S_IXUSR | S_IXGRP | S_IXOTH |
-				S_IWUSR | S_IWGRP | S_IWOTH |
-				S_IRUSR | S_IRGRP | S_IROTH) & ~mask;
-	} else {
-		umask(mask & ~0300);
-	}
+	umask(mask & ~0300); /* Ensure intermediate dirs are wx */
 
-	do {
-		c = 0;
+	while (1) {
+		c = '\0';
 
 		if (flags & FILEUTILS_RECUR) {	/* Get the parent. */
 			/* Bypass leading non-'/'s and then subsequent '/'s. */
@@ -54,20 +47,24 @@
 					do {
 						++s;
 					} while (*s == '/');
-					c = *s;		/* Save the current char */
-					*s = 0;		/* and replace it with nul. */
+					c = *s; /* Save the current char */
+					*s = '\0'; /* and replace it with nul. */
 					break;
 				}
 				++s;
 			}
 		}
 
+		if (!c) /* Last component uses orig umask */
+			umask(mask);
+
 		if (mkdir(path, 0777) < 0) {
 			/* If we failed for any other reason than the directory
-			 * already exists, output a diagnostic and return -1.*/
+			 * already exists, output a diagnostic and return -1. */
 			if (errno != EEXIST
-				|| !(flags & FILEUTILS_RECUR)
-				|| (stat(path, &st) < 0 || !S_ISDIR(st.st_mode))) {
+			 || !(flags & FILEUTILS_RECUR)
+			 || ((stat(path, &st) < 0) || !S_ISDIR(st.st_mode))
+			) {
 				fail_msg = "create";
 				umask(mask);
 				break;
@@ -82,11 +79,10 @@
 		}
 
 		if (!c) {
-			/* Done.  If necessary, updated perms on the newly
+			/* Done.  If necessary, update perms on the newly
 			 * created directory.  Failure to update here _is_
-			 * an error.*/
-			umask(mask);
-			if ((mode != -1) && (chmod(path, mode) < 0)){
+			 * an error. */
+			if ((mode != -1) && (chmod(path, mode) < 0)) {
 				fail_msg = "set permissions of";
 				break;
 			}
@@ -95,9 +91,8 @@
 
 		/* Remove any inserted nul from the path (recursive mode). */
 		*s = c;
+	} /* while (1) */
 
-	} while (1);
-
 	bb_perror_msg("cannot %s directory '%s'", fail_msg, path);
 	return -1;
 }




More information about the busybox-cvs mailing list