FreeBSD Bugzilla – Attachment 187759 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), 3.76 KB, created by
Eugene Grosbein
on 2017-11-05 14:54:21 UTC
(
hide
)
Description:
proposed fix
Filename:
MIME Type:
Creator:
Eugene Grosbein
Created:
2017-11-05 14:54:21 UTC
Size:
3.76 KB
patch
obsolete
>--- psdate.c.orig 2017-11-05 20:02:34.659699000 +0700 >+++ 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) > { > >--- psdate.h.orig 2017-02-15 13:06:22.440745000 +0700 >+++ 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 >--- pw_conf.c.orig 2017-11-05 20:33:23.910138000 +0700 >+++ 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"); > } >--- pw_user.c.orig 2017-11-05 21:37:17.861067000 +0700 >+++ pw_user.c 2017-11-05 21:53:28.021398000 +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,8 @@ 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; >+ > if (arg1 != NULL) { > if (arg1[strspn(arg1, "0123456789")] == '\0') > id = pw_checkid(arg1, UID_MAX); >@@ -1226,12 +1236,20 @@ 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 { >+ now = time(NULL); >+ 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 { >+ now = time(NULL); >+ cmdcnf->password_days = parse_date(now, optarg); >+ } > break; > case 'g': > validate_grname(cmdcnf, optarg);
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