Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Feb 2000 10:40:56 -0500 (EST)
From:      k.stevenson@louisville.edu
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/16880: [PATCH] pw(8) hardcodes directory creation modes
Message-ID:  <20000221154056.534B418605@osaka.louisville.edu>

next in thread | raw e-mail | index | archive | help

>Number:         16880
>Category:       bin
>Synopsis:       [PATCH] pw(8) hardcodes directory creation modes
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Feb 21 07:50:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Keith Stevenson
>Release:        FreeBSD 3.4-STABLE i386
>Organization:
University of Louisville
>Environment:

	FreeBSD-STABLE and FreeBSD-CURRENT


>Description:

	pw(8) ignores umask and always creates directories as mode 0755.  The
enclosed patch against CURRENT respects the parent process umask and adds a
-U option to specify the umask on the command line.

>How-To-Repeat:

	Set umask to something more restrictive than 022 and use pw to create
an account and home directory.

>Fix:
	
	Patch against Current.  Patch has been moderately tested.


Index: pw.8
===================================================================
RCS file: /opt/ncvs/src/usr.sbin/pw/pw.8,v
retrieving revision 1.17
diff -u -r1.17 pw.8
--- pw.8	1999/08/28 01:19:18	1.17
+++ pw.8	2000/02/20 02:41:11
@@ -41,6 +41,7 @@
 .Op Fl u Ar uid
 .Op Fl c Ar comment
 .Op Fl d Ar dir
+.Op Fl U Ar umask
 .Op Fl e Ar date
 .Op Fl p Ar date
 .Op Fl g Ar group
@@ -346,6 +347,8 @@
 - normally
 .Pa /home
 with the account name as a subdirectory.
+.It Fl U Ar umask
+Set the umask to be used when creating the account's home directory and skeleton files.  Default is parent process umask.
 .It Fl e Ar date
 Set the account's expiration date. 
 Format of the date is either a UNIX time in decimal, or a date in
Index: pw.c
===================================================================
RCS file: /opt/ncvs/src/usr.sbin/pw/pw.c,v
retrieving revision 1.18
diff -u -r1.18 pw.c
--- pw.c	2000/01/15 00:20:20	1.18
+++ pw.c	2000/02/20 02:41:12
@@ -29,6 +29,7 @@
   "$FreeBSD: src/usr.sbin/pw/pw.c,v 1.18 2000/01/15 00:20:20 davidn Exp $";
 #endif /* not lint */
 
+#include <ctype.h>
 #include <err.h>
 #include <fcntl.h>
 #include <paths.h>
@@ -89,6 +90,8 @@
 
 static struct cargs arglist;
 
+static int mask;
+
 static int      getindex(const char *words[], const char *word);
 static void     cmdhelp(int mode, int which);
 
@@ -105,13 +108,13 @@
 	static const char *opts[W_NUM][M_NUM] =
 	{
 		{ /* user */
-			"V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:Db:NPy:Y",
-			"V:C:qn:u:rY",
-			"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:FNPY",
-			"V:C:qn:u:FPa7",
-			"V:C:q",
-			"V:C:q",
-			"V:C:q"
+			"V:C:U:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:Db:NPy:Y",
+			"V:C:U:qn:u:rY",
+			"V:C:U:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:FNPY",
+			"V:C:U:qn:u:FPa7",
+			"V:C:U:q",
+			"V:C:U:q",
+			"V:C:U:q"
 		},
 		{ /* grp  */
 			"V:C:qn:g:h:M:pNPY",
@@ -128,7 +131,6 @@
 		pw_group
 	};
 
-	umask(0);		/* We wish to handle this manually */
 	LIST_INIT(&arglist);
 
 	/*
@@ -221,6 +223,30 @@
 			setgrdir(etcpath);
 		}
 	}
+
+	/*
+	 * Set the umask if specified on the command line
+	 */
+
+	if (getarg(&arglist, 'U') != NULL) {
+		char * um = getarg(&arglist, 'U')-> val;
+		if (um != NULL) {
+			if (isdigit(*um)) {
+				mask = 0;
+				do {
+					if (*um >= '8' || *um < '0') {
+						fprintf(stderr, "Illegal umask: %s\n", um);
+						exit(EX_USAGE);
+					}
+					mask = (mask << 3) + (*um - '0');
+				} while (*++um != '\0');
+				umask(mask);
+			} else {
+				fprintf(stderr, "Illegal umask: %s\n", um);
+				exit(EX_USAGE);
+			}
+		}
+	}
     
 	/*
 	 * Now, let's do the common initialisation
@@ -301,6 +327,7 @@
 				"\t-u uid         user id\n"
 				"\t-c comment     user name/comment\n"
 				"\t-d directory   home directory\n"
+				"\t-U umask       Directory/file creation mask\n"
 				"\t-e date        account expiry date\n"
 				"\t-p date        password expiry date\n"
 				"\t-g grp         initial group\n"
Index: pw_user.c
===================================================================
RCS file: /opt/ncvs/src/usr.sbin/pw/pw_user.c,v
retrieving revision 1.34
diff -u -r1.34 pw_user.c
--- pw_user.c	2000/01/15 00:20:21	1.34
+++ pw_user.c	2000/02/20 02:41:16
@@ -179,7 +179,7 @@
 			if (strchr(cnf->home+1, '/') == NULL) {
 				strcpy(dbuf, "/usr");
 				strncat(dbuf, cnf->home, MAXPATHLEN-5);
-				if (mkdir(dbuf, 0755) != -1 || errno == EEXIST) {
+				if (mkdir(dbuf, 0777) != -1 || errno == EEXIST) {
 					chown(dbuf, 0, 0);
 					symlink(dbuf, cnf->home);
 				}
@@ -191,7 +191,7 @@
 				while ((p = strchr(++p, '/')) != NULL) {
 					*p = '\0';
 					if (stat(dbuf, &st) == -1) {
-						if (mkdir(dbuf, 0755) == -1)
+						if (mkdir(dbuf, 0777) == -1)
 							goto direrr;
 						chown(dbuf, 0, 0);
 					} else if (!S_ISDIR(st.st_mode))
@@ -200,7 +200,7 @@
 				}
 			}
 			if (stat(dbuf, &st) == -1) {
-				if (mkdir(dbuf, 0755) == -1) {
+				if (mkdir(dbuf, 0777) == -1) {
 				direrr:	err(EX_OSFILE, "mkdir '%s'", dbuf);
 				}
 				chown(dbuf, 0, 0);
@@ -734,7 +734,7 @@
 	 * existing files will *not* be overwritten.
 	 */
 	if (!PWALTDIR() && getarg(args, 'm') != NULL && pwd->pw_dir && *pwd->pw_dir == '/' && pwd->pw_dir[1]) {
-		copymkdir(pwd->pw_dir, cnf->dotdir, 0755, pwd->pw_uid, pwd->pw_gid);
+		copymkdir(pwd->pw_dir, cnf->dotdir, 0777, pwd->pw_uid, pwd->pw_gid);
 		pw_log(cnf, mode, W_USER, "%s(%ld) home %s made",
 		       pwd->pw_name, (long) pwd->pw_uid, pwd->pw_dir);
 	}

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000221154056.534B418605>