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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000219215109.A46191>
