FreeBSD Bugzilla – Attachment 187765 Details for
Bug 223431
"pw useradd -D -e" writes bogus expire_days value into pw.conf
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
proposed fix
pw-expire.diff (text/plain), 5.39 KB, created by
Eugene Grosbein
on 2017-11-05 18:25:52 UTC
(
hide
)
Description:
proposed fix
Filename:
MIME Type:
Creator:
Eugene Grosbein
Created:
2017-11-05 18:25:52 UTC
Size:
5.39 KB
patch
obsolete
>--- usr.sbin/pw/psdate.c.orig 2017-11-05 20:02:34.659699000 +0700 >+++ usr.sbin/pw/psdate.c 2017-11-05 20:02:07.219521000 +0700 >@@ -38,7 +38,7 @@ static const char rcsid[] = > #include "psdate.h" > > >-static int >+int > numerics(char const * str) > { > >--- usr.sbin/pw/psdate.h.orig 2017-02-15 13:06:22.440745000 +0700 >+++ usr.sbin/pw/psdate.h 2017-11-05 20:03:23.385685000 +0700 >@@ -33,6 +33,7 @@ > #include <sys/cdefs.h> > > __BEGIN_DECLS >+int numerics(char const * str); > time_t parse_date(time_t dt, char const * str); > void print_date(char *buf, time_t t, int dotime); > __END_DECLS >--- usr.sbin/pw/pw_conf.c.orig 2017-11-05 20:33:23.910138000 +0700 >+++ usr.sbin/pw/pw_conf.c 2017-11-05 21:34:44.309488000 +0700 >@@ -207,9 +207,9 @@ passwd_val(char const * str, int dflt) > * Special cases for defaultpassword > */ > if (strcmp(str, "random") == 0) >- return -1; >+ return 2; > if (strcmp(str, "none") == 0) >- return -2; >+ return 3; > > errx(1, "Invalid value for default password"); > } >--- usr.sbin/pw/pw_user.c.orig 2017-11-05 21:37:17.861067000 +0700 >+++ usr.sbin/pw/pw_user.c 2017-11-06 01:22:25.231863000 +0700 >@@ -515,7 +515,14 @@ pw_password(struct userconf * cnf, char > char pwbuf[32]; > > switch (cnf->default_password) { >- case -1: /* Random password */ >+ case 0: /* No login - default */ >+ default: >+ return "*"; >+ >+ case 1: /* user's name */ >+ strlcpy(pwbuf, user, sizeof(pwbuf)); >+ break; >+ case 2: /* Random password */ > l = (arc4random() % 8 + 8); /* 8 - 16 chars */ > for (i = 0; i < l; i++) > pwbuf[i] = chars[arc4random_uniform(sizeof(chars)-1)]; >@@ -532,16 +539,8 @@ pw_password(struct userconf * cnf, char > } > break; > >- case -2: /* No password at all! */ >+ case 3: /* No password at all! */ > return ""; >- >- case 0: /* No login - default */ >- default: >- return "*"; >- >- case 1: /* user's name */ >- strlcpy(pwbuf, user, sizeof(pwbuf)); >- break; > } > return pw_pwcrypt(pwbuf); > } >@@ -1122,11 +1121,20 @@ validate_mode(char *mode) > return (m); > } > >+static long >+validate_expire(char *str, int opt) >+{ >+ if (!numerics(str)) >+ errx(EX_DATAERR, "-%c argument must be numeric " >+ "when setting defaults: %s", (char)opt, str); >+ return strtol(str, NULL, 0); >+} >+ > static void > mix_config(struct userconf *cmdcnf, struct userconf *cfg) > { > >- if (cmdcnf->default_password == 0) >+ if (cmdcnf->default_password < 0) > cmdcnf->default_password = cfg->default_password; > if (cmdcnf->reuse_uids == 0) > cmdcnf->reuse_uids = cfg->reuse_uids; >@@ -1164,9 +1172,9 @@ mix_config(struct userconf *cmdcnf, stru > cmdcnf->min_gid = cfg->min_gid; > if (cmdcnf->max_gid == 0) > cmdcnf->max_gid = cfg->max_gid; >- if (cmdcnf->expire_days == 0) >+ if (cmdcnf->expire_days < 0) > cmdcnf->expire_days = cfg->expire_days; >- if (cmdcnf->password_days == 0) >+ if (cmdcnf->password_days < 0) > cmdcnf->password_days = cfg->password_days; > } > >@@ -1198,6 +1206,9 @@ pw_user_add(int argc, char **argv, char > if ((cmdcnf = calloc(1, sizeof(struct userconf))) == NULL) > err(EXIT_FAILURE, "calloc()"); > >+ cmdcnf->default_password = cmdcnf->expire_days = cmdcnf->password_days = -1; >+ now = time(NULL); >+ > if (arg1 != NULL) { > if (arg1[strspn(arg1, "0123456789")] == '\0') > id = pw_checkid(arg1, UID_MAX); >@@ -1226,12 +1237,16 @@ pw_user_add(int argc, char **argv, char > homedir = optarg; > break; > case 'e': >- now = time(NULL); >- cmdcnf->expire_days = parse_date(now, optarg); >+ if (genconf) >+ cmdcnf->expire_days = validate_expire(optarg, ch); >+ else >+ cmdcnf->expire_days = parse_date(now, optarg); > break; > case 'p': >- now = time(NULL); >- cmdcnf->password_days = parse_date(now, optarg); >+ if (genconf) >+ cmdcnf->password_days = validate_expire(optarg, ch); >+ else >+ cmdcnf->password_days = parse_date(now, optarg); > break; > case 'g': > validate_grname(cmdcnf, optarg); >@@ -1369,8 +1384,12 @@ pw_user_add(int argc, char **argv, char > pwd->pw_uid = pw_uidpolicy(cmdcnf, id); > pwd->pw_gid = pw_gidpolicy(cnf, grname, pwd->pw_name, > (gid_t) pwd->pw_uid, dryrun); >- pwd->pw_change = cmdcnf->password_days; >- pwd->pw_expire = cmdcnf->expire_days; >+ >+ if (cmdcnf->password_days > 0) >+ pwd->pw_change = now + cmdcnf->password_days * 86400L; >+ if (cmdcnf->expire_days > 0) >+ pwd->pw_expire = now + cmdcnf->expire_days * 86400L; >+ > pwd->pw_dir = pw_homepolicy(cmdcnf, homedir, pwd->pw_name); > pwd->pw_shell = pw_shellpolicy(cmdcnf); > lc = login_getpwclass(pwd); >@@ -1511,6 +1530,7 @@ pw_user_mod(int argc, char **argv, char > class = nispasswd = NULL; > quiet = createhome = pretty = dryrun = nis = precrypted = false; > edited = false; >+ now = time(NULL); > > if (arg1 != NULL) { > if (arg1[strspn(arg1, "0123456789")] == '\0') >@@ -1540,11 +1560,9 @@ pw_user_mod(int argc, char **argv, char > homedir = optarg; > break; > case 'e': >- now = time(NULL); > expire_days = parse_date(now, optarg); > break; > case 'p': >- now = time(NULL); > password_days = parse_date(now, optarg); > break; > case 'g': >@@ -1679,13 +1697,14 @@ pw_user_mod(int argc, char **argv, char > } > } > >- if (password_days >= 0 && pwd->pw_change != password_days) { >- pwd->pw_change = password_days; >+ >+ if (password_days >= 0) { >+ pwd->pw_change = now + password_days * 86400L; > edited = true; > } > >- if (expire_days >= 0 && pwd->pw_expire != expire_days) { >- pwd->pw_expire = expire_days; >+ if (expire_days >= 0) { >+ pwd->pw_expire = now + expire_days * 86400L; > edited = true; > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 223431
:
187753
|
187757
|
187758
|
187759
| 187765