Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Feb 2000 21:51:09 -0500
From:      Keith Stevenson <k.stevenson@louisville.edu>
To:        Kris Kennaway <kris@FreeBSD.org>
Cc:        Igor Vinokurov <igor@rtsnet.ru>, freebsd-security@freebsd.org
Subject:   Re: pw && umask
Message-ID:  <20000219215109.A46191@osaka.louisville.edu>
In-Reply-To: <Pine.BSF.4.21.0002191500400.82105-100000@freefall.freebsd.org>
References:  <20000219200142.A605@shogun.rtsnet.ru> <Pine.BSF.4.21.0002191500400.82105-100000@freefall.freebsd.org>

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

--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii

On Sat, Feb 19, 2000 at 03:01:46PM -0800, Kris Kennaway wrote:
> On Sat, 19 Feb 2000, Igor Vinokurov wrote:
> 
> > May be it is necessary to add support umask?
> 
> This should be a trivial amount of hacking (i.e. add another option to
> specify the umask and then use it instead of the hardcoded 0755). Anyone
> up for it?

Patch attached.

I used -U as the umask option and tried to follow the style of the original
code as closely as possible.  It's a bit, um, interesting.  Umask code stolen
from /bin/sh.

Patch has been moderately tested.

Regards,
--Keith Stevenson--

-- 
Keith Stevenson
System Programmer - Data Center Services - University of Louisville
k.stevenson@louisville.edu
PGP key fingerprint =  4B 29 A8 95 A8 82 EA A2  29 CE 68 DE FC EE B6 A0

--uAKRQypu60I7Lcqm
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="pw.patch"

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);
 	}

--uAKRQypu60I7Lcqm--


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




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