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>
