Subject: bin/2686: [dM] mkdir -p -m ignores -m
To: None <gnats-bugs@NetBSD.ORG>
From: der Mouse <mouse@Collatz.McRCIM.McGill.EDU>
List: netbsd-bugs
Date: 08/12/1996 10:15:28
>Number:         2686
>Category:       bin
>Synopsis:       [dM] mkdir -p -m ignores -m
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Aug 12 10:35:00 1996
>Last-Modified:
>Originator:     der Mouse
>Organization:
	Dis-
>Release:        -current (1.2 release branch), $NetBSD: mkdir.c,v 1.14 1995/06/25 21:59:21 mycroft Exp $
>Environment:
	Any (noticed on Sun-3/260, verified on SPARC IPC)
>Description:
	When -p is given to mkdir, any -m argument is ignored.

	Incidentally, this would have been caught by -Wunused, since
	without the fix, the second argument to mkpath() is unused.

	Secondarily (this isn't a bug, just an efficiency concern), it
	might be worth instrumenting mkdir -p to determine how many
	directories need to be made in the "average" mkdir -p run.  If,
	as I suspect, the number is small (probably less than one), it
	would save syscalls to walk the path starting with the full
	path and trimming components off the end, instead of (as it
	does now) walking from the start, stat()ing until a nonexistent
	directory is found.
>How-To-Repeat:
	[Callisto] 16> umask
	22
	[Callisto] 17> mkdir -m 0710 -p /tmp/foo/bar/blee
	[Callisto] 18> ls -lR /tmp/foo
	total 1
	drwxr-xr-x  3 mouse         512 Aug 12 10:05 bar
	
	/tmp/foo/bar:
	total 1
	drwxr-xr-x  2 mouse         512 Aug 12 10:05 blee
	
	/tmp/foo/bar/blee:
	total 0
	[Callisto] 19> 

	(notice that blee, the terminal directory, is the same mode
	0755 as the rest, ignoring the -m 0710).
>Fix:
	This works for me, fixing the bug.  I haven't addressed the
	efficiency concern mentioned under "Description".

--- OLD/bin/mkdir/mkdir.c	Thu Jan  1 00:00:00 1970
+++ NEW/bin/mkdir/mkdir.c	Thu Jan  1 00:00:00 1970
@@ -149,7 +149,7 @@
 		*slash = '\0';
 
 		if (stat(path, &sb)) {
-			if (errno != ENOENT || mkdir(path, dir_mode)) {
+			if (errno != ENOENT || mkdir(path, done?mode:dir_mode)) {
 				warn("%s", path);
 				return (-1);
 			}

					der Mouse

			    mouse@collatz.mcrcim.mcgill.edu
		    01 EE 31 F6 BB 0C 34 36  00 F3 7C 5A C1 A0 67 1D
>Audit-Trail:
>Unformatted: