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>